簡體   English   中英

在 python 中按組打印列表項

[英]Printing list items by group in python

我還是 Python 的新手。 我有與以下列表類似的列表:

items = [[4, 'A'], [4, 'B'], [5, 'C'], [5, 'D'], [5, 'E'], [6, 'F'], [6, 'G']]

我試圖通過將第一個項目組合在一起來打印它並得到如下內容:

4 : ['A', 'B']
5 : ['C', 'D', 'E']
6 : ['F', 'G']

我該怎么做呢?

output = {}

items = [[4, 'A'], [4, 'B'], [5, 'C'], [5, 'D'], [5, 'E'], [6, 'F'], [6, 'G']]

for number, letter in items:
    if number not in output:
        output[number] = []
    output[number].append(letter)


print('\n'.join(f'{number} : {letters}' for number, letters in output.items()))

Output

4 : ['A', 'B']
5 : ['C', 'D', 'E']
6 : ['F', 'G']

解釋

  • 我使用名稱items而不是list以免與 stdlib list沖突。
  • 我在遍歷項目時將數字和字母解壓縮為兩個變量。
  • 對於每個項目,我檢查它是否已經作為 output 中的鍵存在。 如果沒有,我實例化一個空列表。*
  • 我把 append 的字母放入其對應的列表中。

* 我建議使用collections.defaultdict來簡化您的代碼。

這是一個簡單的解決方案(但對於大列表來說很慢),不需要任何外部 package:

res = {}
for k,v in items:
    res[k] = res.get(k, []) + [v]
print('\n'.join(f'{k} : {res[k]}' for k in res))

您可以使用itertools.groupbyoperator.itemgetter

>>> from itertools import groupby
>>> from operator import itemgetter
>>> list_ = [[4, 'A'], [4, 'B'], [5, 'C'], [5, 'D'], [5, 'E'], [6, 'F'], [6, 'G']]
>>> print(*(f'{k}: {sum(list(g), [])}' 
            for k, g in groupby(list_, key=lambda x: list.pop(x, 0))), 
           sep='\n')
4: ['A', 'B']
5: ['C', 'D', 'E']
6: ['F', 'G']

如果您想在不導入任何內容的情況下執行此操作:

>>> list_ = [[4, 'A'], [4, 'B'], [5, 'C'], [5, 'D'], [5, 'E'], [6, 'F'], [6, 'G']]

>>> table = {}

>>> for key, value in list_:
        table.setdefault(key, []).append(value)
    

>>> table
{4: ['A', 'B'], 5: ['C', 'D', 'E'], 6: ['F', 'G']}

>>> for key, group in table.items():
        print(f'{key}: {group}')
    
4: ['A', 'B']
5: ['C', 'D', 'E']
6: ['F', 'G']

您可以為此使用字典方法setdefault 它是這樣工作的:
如果鍵在字典中,則返回其值。 如果不是,則插入值為默認值的鍵(在這種情況下為空list )並返回默認值( list )。

result = {}
for item in items:
    result.setdefault(item[0], []).append(item[1])

print(result)

Output:

{4: ['A', 'B'], 5: ['C', 'D', 'E'], 6: ['F', 'G']}

暫無
暫無

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

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