如何使用for循环从其他可迭代对象创建特定字典?

时间:2019-01-04 12:28:10

标签: python python-2.7 loops

我想使用一个迭代器创建一个字典,该迭代器本身也具有多个迭代器。

我尝试过:

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'}

3 个答案:

答案 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

另一个答案给出的理解也很好。

顺便说一句,您不应使用dictlist作为变量名。这是一个内置词,因此您将以神秘的方式破坏程序。

使用列表作为默认参数也将导致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]

请参见"Least Astonishment" and the Mutable Default Argument