2015-05-05 126 views
0

我知道下面的語法是關閉的,但我很難弄清楚應該如何寫。我想要做的是拿出列表「list」,並創建一個字典,其中的鍵是每個單詞與其他單詞的組合,每個單詞不是它自己的,每個鍵的值都是0.這是我破碎的代碼:通過Python創建字典通過多個for循環

lst = ('human', 'loud', 'big') 
for words in lst: 
    first = words 
    for words in lst: 
     if words != first: 
      scores = {'%s + %s': 0, % (first, words)} 

解釋是這樣的:

scores = {'human + loud': 0, 'human + big': 0, 'loud + big': 0, 'loud + human': 0, 'big + loud': 0, 'big + human': 0} 

任何幫助,不勝感激!

修改:將列表類型更改爲lst。

回答

1

我有一個更緊湊的功能。

import itertools 
scores = {} 
for a,b in itertools.permutations(('human', 'loud', 'big'), 2): 
    scores["{0} + {1}".format(a,b)] = 0 
print scores 
+0

非常好,與詞典理解也很好,對於排列中的x(lst,2),'{'+'.join(x):0}' –

+0

很好地完成。非常感謝。 – Will

1

您對字典賦值行有語法問題,但更重要的問題是您每次都重新分配字典。

相反,在開始時創建字典,然後添加到它。

最終列表不是一個好的變量名稱,因爲它與類型的名稱相沖突。

mylist = ('human', 'loud', 'big') 
scores = {} 
for w in mylist: 
    for v in mylist: 
     if w != v: 
      scores['%s + %s' % (w, v)] = 0 

print scores 
+1

還值得一提的是'list'是一個不好的變量名,因爲它與列表類型衝突 –

+0

快速響應,一百萬謝謝你。真的很感激它。 – Will

1

嘗試以下操作:

lst = ('human', 'loud', 'big') 
scores = {} 
for f in lst: 
    for s in lst: 
     if f != s: 
      scores['{0} + {1}'.format(f, s)] = 0 

print scores 

這樣:

>>> lst = ('human', 'loud', 'big') 
>>> scores = {} 
>>> for f in lst: 
...  for s in lst: 
...   if f != s: 
...    scores['{0} + {1}'.format(f, s)] = 0 
... 
>>> print scores 
{'human + big': 0, 'big + loud': 0, 'big + human': 0, 'human + loud': 0, 'loud + big': 0, 'loud + human': 0} 
>>> 
+0

哇 - 超級快。這工作。真的很感激它。 – Will

+0

此外,如果您使用循環頂部的枚舉,則可以在第二個循環中迭代子列表,從index + 1開始,因此您不必檢查是否是該單詞...因爲您的單詞是獨一無二的, 對? – jheld

0

你有正確的想法 - 這是你有固定的語法基本邏輯。兩個主要的改變是:1)你需要在你的內循環中命名迭代器變量,它與你外循環中的迭代器變量不同,否則這些作用域將會發生衝突,以及2)向字典添加事物,使用[key]而不是試圖用大括號表示法來創建一個全新的字典。

list = ['human', 'loud', 'big'] 
scores = {} 
for i in range(len(list)): 
    for j in range(len(list)): 
     if i != j: 
      key = list[i] + " + " + list[j] 
      scores[key] = 0 
0

這是我的工作片段。我建議創建字典,然後添加到它。

scores = {} 

    lst = ('human', 'loud', 'big') 

    for words in list: 
     first = words 
     for words in list: 
      if words != first: 
       scores.update({first + " + " + words: 0}) 

    print scores 

我建議改變一些變量名來區分每個嵌套列表中使用的單詞。因爲這樣你就可以完全消除「第一」變量。

scores = {} 

    lst = ('human', 'loud', 'big') 

    for word1 in list: 
     for word2 in list: 
      if word2 != word1: 
       scores.update({word1 + " + " + word2: 0}) 

    print scores 
0

使用itertools.combinations

from itertools import combinations as comb 
l = ['human', 'loud', 'big'] 
scores = dict((" + ".join(pair), 0) 
       for ordered_pair in comb(l, 2) 
       for pair in (ordered_pair, reversed(ordered_pair)))