對于給定的單詞串列,例如
meyveler=["elma","armut","?eftali","kiraz","muz","erik","üzüm","nar","karpuz","kavun","kivi","havu?","portakal","mandalina"]
我想創建一個字典,在相同的組中顯示具有相同字母數字的單詞,如下面的示例輸出所示。
{ 3:['muz','nar'], 4: [‘kivi’,'elma','erik','üzüm' ] 5: [‘havu?’, 'armut','kiraz','kavun'] 6: [‘karpuz’], 7: [‘?eftali’], 8: [‘portakal’], 9: [‘mandalina’] }
這是一個代碼片段,顯示了我迄今為止嘗試過的內容:
n={}
t=set()
for i in meyveler:
t.add(len(i))
p=list(t)
for i in meyveler:
q=0
while q<len(p):
if len(i)==p[q]:
n.update({p[q]:[i]})
q =1
print(n)
uj5u.com熱心網友回復:
代碼可以大大簡化——這個片段一次讀入一個詞并將其插入到適當的串列中(如果一個詞的長度我們當時沒有看到,則創建新的鍵值對):
meyveler=["elma","armut","?eftali","kiraz","muz","erik","üzüm","nar","karpuz","kavun","kivi","havu?","portakal","mandalina"]
n = {}
for word in meyveler:
if len(word) not in n:
n[len(word)] = []
n[len(word)].append(word)
print(n)
uj5u.com熱心網友回復:
我認為您正在使事情變得比您需要的更復雜。只需回圈遍歷單詞集并附加到串列中(如果您還沒有看到計數,則創建串列)。setdefault()這很方便。您也可以使用collections.defaultdict。
meyveler=["elma","armut","?eftali","kiraz","muz","erik","üzüm","nar","karpuz","kavun","kivi","havu?","portakal","mandalina"]
counts = {}
for word in set(meyveler):
counts.setdefault(len(word), []).append(word)
print(counts)
# {7: ['?eftali'], 4: ['elma', 'üzüm', 'kivi', 'erik'], 5: ['havu?', 'kavun', 'armut', 'kiraz'], 3: ['nar', 'muz'], 8: ['portakal'], 6: ['karpuz'], 9: ['mandalina']}
編輯:
我將原始串列傳遞給,set()因為我看到了您的使用,set()并認為您可能會擔心重復項。正如評論中提到的,您可以在字典 ( counts.setdefault(len(word), set())) 中使用集合而不是串列。或者,如果您不關心重復項,只需遍歷串列 ( for word in meyveler:...)。
uj5u.com熱心網友回復:
您的代碼不會生成您想要的字典,因為在每次迭代中,您都在更新n而不是添加其值。如果你更換
n.update({p[q]:[i]})
和
n[p[q]] = n.get(p[q], []) [i]
您的代碼將按預期作業。但正如其他答案所暗示的那樣,最好迭代meyveler一次并n根據其長度決定將單詞放在何處,而不是使用 2 次迭代(或在您的情況下為兩次迭代)。這就是為什么使用像collections.defaultdictor 之類的方法是一個更好的解決方案,dict.setdefault或者dict.get您可以為尚未定義的鍵設定默認值(例如空串列)并附加到它們。
這是一種方法:
from collections import defaultdict
n = defaultdict(list)
for w in meyveler:
n[len(w)].append(w)
這是另一個(此方法查找長度并再次遍歷串列,類似于您的方法,但您會發現這比其他方法慢):
n = {}
for length, word in zip(map(len, meyveler), meyveler):
n[length] = n.get(length, []) [word]
輸出:
{4: ['elma', 'erik', 'üzüm', 'kivi'],
5: ['armut', 'kiraz', 'kavun', 'havu?'],
7: ['?eftali'],
3: ['muz', 'nar'],
6: ['karpuz'],
8: ['portakal'],
9: ['mandalina']}
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/401159.html
