我想使用一个迭代器创建一个字典,该迭代器本身也具有多个迭代器。
我尝试过:
def setdict(list = ["hello", "world", "something", "foo"])
for i in list:
dict = {i[0]:i}
return dict
print setdict(list = ["hello", "world", "something", "foo"])
我希望输出如下:
{"h":"hello", "w":"world", "s":"something", "f":"foo"}
但实际输出是:
{'f': 'foo'}
答案 0 :(得分:3)
使用dict
理解
例如:
def setdict(lst = ["hello", "world", "something", "foo"]):
return {i[0]:i for i in lst}
print setdict(lst = ["hello", "world", "something", "foo"])
输出:
{'h': 'hello', 's': 'something', 'w': 'world', 'f': 'foo'}
在您的情况下,您将在每个循环中覆盖字典。
答案 1 :(得分:3)
这里:
dict = {i[0]:i}
您每次都在创建新词典。
先声明然后更新:
result = {}
for i in items:
result[i[0]] = i
return result
另一个答案给出的理解也很好。
顺便说一句,您不应使用dict
或list
作为变量名。这是一个内置词,因此您将以神秘的方式破坏程序。
使用列表作为默认参数也将导致awful surprising errors
答案 2 :(得分:2)
您的for循环在每次迭代时重新创建整个dict():dict = {i[0]:i}
-为您保留最后一个值。
您的(有效的)实施可以实现
print setdict(["hello", "world", "something", "foo", "hello - 2"])
到
{"h":"hello - 2", "w":"world", "s":"something", "f":"foo"}
松开第一个"hello"
。
使用defaultdict最好避免覆盖重复项:
from collections import defaultdict
def setdict(l): # dont do l = [] - it has ramifications
d = defaultdict(list)
for i in l:
d[i[0]].append(i)
return dict(d)
print setdict(["hello", "world", "something", "foo", "hello - 2"])
输出:
{'h': ['hello', 'hello - 2'], 's': ['something'], 'w': ['world'], 'f': ['foo']}
其他评论和后果:
在内置插件之后不要调用变量-它们会隐藏变量:
k = str(5)
str = 22
o = str(5) # crash - the str-function is shadowed
避免使用引用的默认参数:
def k(l=[]): # reference default param, keeps values
l.append(0) # over different calls of the function
return l
print(k())
print(k())
print(k())
print(k())
print(k())
[0]
[0, 0]
[0, 0, 0]
[0, 0, 0, 0]
[0, 0, 0, 0, 0]