【问题标题】:Sorting and Matching a Python list排序和匹配 Python 列表
【发布时间】:2016-05-10 12:49:18
【问题描述】:

我最近问了一个类似的问题,但需要更深入一点。

基本上,我正在读取文件目录并将所有内容附加到名为 filelistname

的列表中

我正在尝试按 diskcount (-#disk-) 对该列表进行排序,并针对该排序列表运行一个函数。

感谢您的帮助。


这是一个例子-

 In []: filelistname
Out []: ['C:\Test3\ARRAY05-2NODE-RAID1-12disk-128k-0-segmented.xlsx'
         'C:\Test1\ARRAY05-2NODE-RAID1-17disk-128k-0-segmented.xlsx',
         'C:\Test4\ARRAY05-2NODE-RAID1-25disk-128k-0-segmented.xlsx',
         'C:\Test2\ARRAY05-2NODE-RAID1-18disk-128k-0-segmented.xlsx',
         'C:\Test1\ARRAY05-2NODE-RAID1-12disk-32k-0-segmented.xlsx',
         'C:\Test6\ARRAY05-2NODE-RAID1-25disk-32k-0-segmented.xlsx',
         'C:\Test2\ARRAY05-2NODE-RAID1-12disk-64k-0-segmented.xlsx',
         'C:\Test5\ARRAY05-2NODE-RAID1-12disk-64k-100-segmented.xlsx']

这个的输出看起来像这样。

一组

  C:\Test3\ARRAY05-2NODE-RAID1-12disk-128k-0-segmented.xlsx
  C:\Test1\ARRAY05-2NODE-RAID1-17disk-128k-0-segmented.xlsx
  C:\Test2\ARRAY05-2NODE-RAID1-18disk-128k-0-segmented.xlsx

另一组

  C:\Test4\ARRAY05-4NODE-RAID1-25disk-128k-0-segmented.xlsx

另一组

  C:\Test1\ARRAY05-2NODE-RAID1-12disk-32k-0-segmented.xlsx
  C:\Test6\ARRAY05-2NODE-RAID1-25disk-32k-0-segmented.xlsx

另一组

  C:\Test2\ARRAY05-2NODE-RAID1-12disk-64k-0-segmented.xlsx

另一组

  C:\Test5\ARRAY05-2NODE-RAID1-12disk-64k-100-segmented.xlsx

我目前正在玩这个,但无法识别正确的键。

import os
from itertools import groupby
from collections import defaultdict

key_fn = lambda s: s.rsplit('-',4)[0]

filelistname = sorted(filelistname, key=key_fn)
print(key)

for key, grouped_file_names in groupby(filelistname, key=key_fn):
    print('\n'.join(list(grouped_file_names)))
    print("")

【问题讨论】:

  • 你能显示预期的输出吗?
  • @whrrgarbl 我编辑了我的帖子。

标签: python list sorting collections defaultdict


【解决方案1】:

您似乎是按d+k-d+ 分组的,因此拆分基本名称并将其用作键:

from collections import defaultdict
d = defaultdict(list)

for sub in l:
    spl = sub.rsplit("-", 3)
    k = spl[-3],spl[-2]
    d[k].append(sub)

输出:

from pprint import pprint as pp

pp(d)

{ ('128k', '0'): [ 'C:\\Test3\\ARRAY05-2NODE-RAID1-12disk-128k-0-segmented.xlsxC:\\Test1\\ARRAY05-2NODE-RAID1-17disk-128k-0-segmented.xlsx',
                   'C:\\Test4\\ARRAY05-2NODE-RAID1-25disk-128k-0-segmented.xlsx',
                   'C:\\Test2\\ARRAY05-2NODE-RAID1-18disk-128k-0-segmented.xlsx'],
  ('32k', '0'): [ 'C:\\Test1\\ARRAY05-2NODE-RAID1-12disk-32k-0-segmented.xlsx',
                  'C:\\Test6\\ARRAY05-2NODE-RAID1-25disk-32k-0-segmented.xlsx'],
  ('64k', '0'): ['C:\\Test2\\ARRAY05-2NODE-RAID1-12disk-64k-0-segmented.xlsx'],
  ('64k', '100'): [ 'C:\\Test5\\ARRAY05-2NODE-RAID1-12disk-64k-100-segmented.xlsx']}

如果你想要除了磁盘部分之外的所有内容:

from collections import defaultdict
from os import path
from ntpath import basename
d = defaultdict(list)

for sub in l:
    spl = basename(sub).rsplit("-", 5)
    k = spl[0]+"-" + "-".join(spl[3:5])
    d[k].append(sub)

输出:

{'ARRAY05-2NODE-128k-0': ['C:\\Test3\\ARRAY05-2NODE-RAID1-12disk-128k-0-segmented.xlsx',
                          'C:\\Test1\\ARRAY05-2NODE-RAID1-17disk-128k-0-segmented.xlsx',
                          'C:\\Test4\\ARRAY05-2NODE-RAID1-25disk-128k-0-segmented.xlsx',
                          'C:\\Test2\\ARRAY05-2NODE-RAID1-18disk-128k-0-segmented.xlsx'],
 'ARRAY05-2NODE-32k-0': ['C:\\Test1\\ARRAY05-2NODE-RAID1-12disk-32k-0-segmented.xlsx',
                         'C:\\Test6\\ARRAY05-2NODE-RAID1-25disk-32k-0-segmented.xlsx'],
 'ARRAY05-2NODE-64k-0': ['C:\\Test2\\ARRAY05-2NODE-RAID1-12disk-64k-0-segmented.xlsx'],
 'ARRAY05-2NODE-64k-100': ['C:\\Test5\\ARRAY05-2NODE-RAID1-12disk-64k-100-segmented.xlsx']}

【讨论】:

  • 太好了,非常感谢!如何包括排序以包括前 3 个元素,例如“ARRAY#、NODE、RAID”。基本上也对#diskcount 之前的所有内容进行排序。我尝试使用 k = spl[-2],spl[-3],spl[-4]
  • @user2877133,您要排序还是分组?
  • 我猜它会被认为是分组?顺序无关紧要。
  • 所以基本上你想删除12disk并保留ARRAY05-2NODE-RAID1-12disk-64k-100的其余部分?
  • 是的,按除磁盘数之外的所有内容进行分组。让我更新一下我的例子。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-11-26
  • 1970-01-01
  • 2022-12-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-25
  • 1970-01-01
相关资源
最近更新 更多