亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
12下一頁
最近訪問板塊 發(fā)新帖
查看: 5998 | 回復: 13
打印 上一主題 下一主題

一堆目錄名組成的list,如何保留覆蓋范圍最大的那幾個目錄 [復制鏈接]

論壇徽章:
0
跳轉到指定樓層
1 [收藏(0)] [報告]
發(fā)表于 2014-01-08 18:02 |只看該作者 |倒序瀏覽
比如說['/home/tmp2','/home', '/home/tmp1', '/usr', '/usr/bin'] 變成 ['/home', '/usr']
這個列表里面的目錄是隨機排列的,我如何保留最頂層涵蓋范圍最大的那幾個目錄,并且把所有子目錄都丟棄?
沒有思路,該怎么做?

論壇徽章:
11
技術圖書徽章
日期:2014-03-01 14:44:34天蝎座
日期:2014-05-21 22:11:59金牛座
日期:2014-05-30 17:06:14
2 [報告]
發(fā)表于 2014-01-08 19:40 |只看該作者
如果可以排序:
  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-

  3. def main():
  4.     uniq = []
  5.     def comdir(x, y):
  6.         if x and y.startswith(x):
  7.             return x
  8.         else:   
  9.             uniq.append(y)
  10.             return y

  11.     dirs = ['/var/log', '/var/lib',
  12.             '/home/tmp2','/home', '/home/tmp1',
  13.             '/usr', '/usr/bin'
  14.     ]   
  15.     dirs.sort()

  16.     # 排序后的目錄名稱符合如下規(guī)則:如果一組目錄能合并為一個目錄,
  17.     # 那么該組目錄必定連續(xù)出現(xiàn),且該組第一個元素就是那個公共的目錄。
  18.     reduce(comdir, dirs, '')

  19.     # 預期結果:['/home', '/usr', '/var/lib', '/var/log']
  20.     print uniq

  21. if __name__ == '__main__':
  22.     main()
復制代碼
回復 1# liaozd


   

論壇徽章:
1
子鼠
日期:2014-05-04 13:59:31
3 [報告]
發(fā)表于 2014-01-08 20:24 |只看該作者
  1. >>>
  2. >>> import re
  3. >>> a = ['/home/tmp2', '/home', '/home/tmp1', '/usr', '/usr/bin']
  4. >>> for i in a:
  5. ...      b.append(re.findall('/*\w+', i)[0])
  6. ...
  7. >>> list(set(b))
  8. ['/usr', '/home']
復制代碼

論壇徽章:
4
白羊座
日期:2013-11-05 10:26:09冥斗士
日期:2015-11-17 14:19:55白銀圣斗士
日期:2015-11-17 15:13:0815-16賽季CBA聯(lián)賽之新疆
日期:2016-04-01 09:10:58
4 [報告]
發(fā)表于 2014-01-09 09:45 |只看該作者
本帖最后由 icymirror 于 2014-01-09 14:05 編輯

回復 1# liaozd

思路:
1. 把路徑頭找出來

  1. rawdata = ['/home/tmp2','/home', '/home/tmp1', '/usr', '/usr/bin'] # 原始數(shù)據(jù)
  2. newdata = [item[:item.find('/', 1) if item.find('/', 1) > 0 else len(item)] for item in rawdata] # 取出各個原始數(shù)據(jù)(路徑的開頭)
復制代碼
2. 根據(jù)出現(xiàn)的頻率來確定是否保留 (不確定需要的 bar ,所以,只統(tǒng)計頻率)

  1. import collections
  2. freqdict = collections.defaultdict(int) # 確保如果找不到 key,返回一個整數(shù),0
  3. for item in newdata:
  4.     freqdict[item] += 1
復制代碼
3. 頻率排序,結果自己過濾

  1. result = [(value, key) for key, value in freqdict.iteritems()]  # 構造一個由元組 (頻率, 路徑) 組成的列表
  2. result.sort(reverse=True) # 列表排序,從大到小,方便從開頭開始取結果
復制代碼
Sorry,之前沒有改完就回復了,現(xiàn)在是完成之后的內(nèi)容。

論壇徽章:
5
丑牛
日期:2014-01-21 08:26:26卯兔
日期:2014-03-11 06:37:43天秤座
日期:2014-03-25 08:52:52寅虎
日期:2014-04-19 11:39:48午馬
日期:2014-08-06 03:56:58
5 [報告]
發(fā)表于 2014-01-09 12:55 |只看該作者
也還是看不懂。
{:2_170:}

論壇徽章:
0
6 [報告]
發(fā)表于 2014-01-09 14:36 |只看該作者
回復 2# timespace

謝謝,不過考慮這種情況'/home' 和 '/homeland/'

python是否有判斷兩個目錄是否是互為子目錄的模塊函數(shù)?


   

論壇徽章:
0
7 [報告]
發(fā)表于 2014-01-09 16:03 |只看該作者
回復 1# liaozd
  1. def getroot(d):
  2.     ds = d.split("/")
  3.     #print(ds)
  4.     return ds[1]

  5. if __name__ == "__main__":
  6.     dirlist = ['/var/log', '/var/lib',
  7.         '/home/tmp2','/home', '/home/tmp1',
  8.         '/usr', '/usr/bin' ]

  9.     dirdict = dict()
  10.     for d in dirlist:
  11.         rootn = getroot(d)
  12.         dirdict[rootn] = dirdict.get(rootn, 0) + 1

  13.     keys = dirdict.keys()
  14.     for x in keys:
  15.         print(x)

復制代碼

論壇徽章:
0
8 [報告]
發(fā)表于 2014-01-09 16:45 |只看該作者
本帖最后由 liaozd 于 2014-01-09 16:51 編輯

回復 2# timespace

修改了一下,不知道是不是還有不完備的地方
  1. #!/usr/bin/env python

  2. uniq = []

  3. def comDir(x,y):
  4.         # 所有目錄的結尾都加‘/’
  5.         if x is not '' and not x.endswith('/'):
  6.                 x += '/'
  7.         if not y.endswith('/'):
  8.                 y += '/'
  9.         print x, y
  10.         if x and y.startswith(x):
  11.                 return x
  12.         else:
  13.                 uniq.append(y)
  14.                 return y

  15. dirs = ['/var/log', '/var/lib',
  16.         '/home/tmp1','/home', '/home/tmp1/tmp2', ‘/homeland’
  17.         ]

  18. dirs.sort()  

  19. reduce(comDir, dirs, '')

  20. print uniq
復制代碼
輸出
['/home/', '/homeland/', '/var/lib/', '/var/log/']

論壇徽章:
11
技術圖書徽章
日期:2014-03-01 14:44:34天蝎座
日期:2014-05-21 22:11:59金牛座
日期:2014-05-30 17:06:14
9 [報告]
發(fā)表于 2014-01-09 17:05 |只看該作者
本帖最后由 timespace 于 2014-01-09 17:15 編輯

回復 8# liaozd
哦,明白你意思了,是要讓路徑名規(guī)范化,然后才能準確的用startswith ?

推薦用:
  1. >>> from os.path import normpath
  2. >>> dir1 = ['/usr/lib/', 'usr/../lib', '/usr//lib']
  3. >>> dir2 = [normpath(e) for e in dir1]
  4. >>> dir2
  5. ['/usr/lib', 'lib', '/usr/lib']
復制代碼

論壇徽章:
4
金牛座
日期:2013-10-11 16:12:50卯兔
日期:2014-07-31 09:17:19辰龍
日期:2014-08-08 09:28:02獅子座
日期:2014-09-14 20:32:05
10 [報告]
發(fā)表于 2014-01-09 18:15 |只看該作者
本帖最后由 ssfjhh 于 2014-01-09 18:18 編輯

一行搞定。
  1. In [1]: a = ['/home/tmp2','/home', '/home/tmp1', '/usr', '/usr/bin']

  2. In [2]: [i for i in a if i.rpartition('/')[0] not in a]
  3. Out[2]: ['/home', '/usr']
復制代碼
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復

  

北京盛拓優(yōu)訊信息技術有限公司. 版權所有 京ICP備16024965號-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報專區(qū)
中國互聯(lián)網(wǎng)協(xié)會會員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關心和支持過ChinaUnix的朋友們 轉載本站內(nèi)容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP