簡體   English   中英

用子列表的給定元素將列表中的子列表集分開

[英]Separate a set of sublists from within a list by a given element of a sublist

輸入為:

 main_list = [['a','1','x'], ['b','2', 'm'], ['a', '23', 'm'], ['c', '34', 'x'], ['b', '11'], ['b', '32', 'y']]

最終結果應為:

 a_list = [['a','1','x'], ['a', '23', 'm']]
 b_list = [['b','2', 'm'], ['b', '32', 'y']]   <-- note that list ['b', '11'] has not been included as it has less elements.
 c_list = ['c', '34', 'x']

我個人做了這樣的事情:

 a_list = [[p for p in item] for item in main_list if "a" in item[0]]
 b_list = [[p for p in item] for item in main_list if "b" in item[0] and len(item) > 2]
 c_list = [[p for p in item] for item in main_list if "c" in item[0]]

想知道是否有一種方法可以一次提取所有三個列表,而不是遍歷main_list三次。

為了擴展該問題,如果沒有給出任何元素,但是算法應該按給定位置處的常用元素對子列表進行排序,您將如何處理。

干杯,

有時最好的方法是最簡單的方法。 列表理解能力很好,但是可能難以理解且難以理解。 它們也不比可比的for循環快。 無法將其輕松轉換為列表理解的原因是,您將需要追加到現有列表以將1個列表轉換為3。您可能可以使用yield但這又需要大量工作。

main_list = [['a','1','x'], ['b','2', 'm'], ['a', '23', 'm'], ['c', '34', 'x'], ['b', '11'], ['b', '32', 'y']]

a_list, b_list, c_list = [],[],[]

for item in main_list:
    if "a" in item[0]:
        a_list.append(item)
    elif "b" in item[0] and len(item) > 2:
        b_list.append(item)
    elif "c" in item[0]:
        c_list.append(item)

print a_list
print b_list
print c_list

輸出:

[['a', '1', 'x'], ['a', '23', 'm']]
[['b', '2', 'm'], ['b', '32', 'y']]
[['c', '34', 'x']]

itertools模塊中的groupby將獲得您正在尋找的信息(以及更多信息):

In [31]: main_list = [['a','1','x'], ['b','2', 'm'], ['a', '23', 'm'], ['c', '34', 'x'], ['b', '11'], ['b', '32', 'y']]

In [32]: g = itertools.groupby(main_list, key=lambda x: (x[0], len(x)))

要查看該生成器中的內容,請運行:

In [33]: for x in g: print x[0], list(x[1])
('a', 3) [['a', '1', 'x']]
('b', 3) [['b', '2', 'm']]
('a', 3) [['a', '23', 'm']]
('c', 3) [['c', '34', 'x']]
('b', 2) [['b', '11']]
('b', 3) [['b', '32', 'y']]

如您所見,這將生成所有長度的信息。 您只對length = 3感興趣。 根據實際使用生成器的方式,有多種方法可以丟棄其他長度。

例如,此操作將生成器g的信息提取到字典d ,並包含您要查找的結果:

In [65]: g = itertools.groupby(main_list, key=lambda x: (x[0], len(x)))

In [66]: d = collections.defaultdict(list)

In [67]: for x in g:
    if x[0][1]==3: d[x[0][0]].append(list(x[1])[0])
   ....:     

In [68]: d['a']
Out[68]: [['a', '1', 'x'], ['a', '23', 'm']]

In [69]: d['b']
Out[69]: [['b', '2', 'm'], ['b', '32', 'y']]

In [70]: d['c']
Out[70]: [['c', '34', 'x']]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM