【问题标题】:Dictionary comprehension problem in pythonpython中的字典理解问题
【发布时间】:2021-02-17 17:08:46
【问题描述】:
A=[1,2,3,4,5]
B=['a','b','c']

我想要输出:

{1: 'a', 2: 'b', 3: 'c', 4: None, 5: None}

我们可以有任意数量的键。

我想在 python 中使用字典理解创建一个包含这两个列表的字典,列表 A 将成为键,其他是键 4 和 5 的值,我们必须打印 None 和其他具有相应值的键我们如何使用听写理解。 提前致谢。

【问题讨论】:

  • 你有没有尝试过什么?
  • 将 zip_longest 与字典理解一起使用。
  • 无论如何,只要使用itertools.zip_longest: dict(zip_longest(B, A)) 不需要字典理解
  • {a:b for a,b in itertools.zip_longest(A,B)}
  • 通常,一个好的答案是“你应该这样做 this 方式”

标签: python dictionary-comprehension


【解决方案1】:

[None]*(len(a)-len(b)) 将创建 n (这里是 len(a)-len(b))) 时间 None 并且您可以使用 += 将它们添加到列表中:

b += [None]*(len(a)-len(b))

您可以使用dict()函数制作字典:

dict(zip(a,b))

完整代码:

a = [1, 2, 3, 4, 5]
b = ['a', 'b', 'c']

b += [None]*(len(a)-len(b))

dic = dict(zip(a, b))
print(dic)



注意
如果您不知道哪个是最长的列表,那么您可以使用:
if len(a) > len(b):
    b += [None]*(len(a)-len(b))
elif len(a) < len(b):
    a += [None]*(len(b)-len(a))

len(a) &lt; len(b) 的情况下,None 将被覆盖,值为 None,它将是 b 中的最后一项。为了避免您可以使用dict(zip(b, a)) 而不是dict(zip(a, b))。然后您应该按如下方式更改完整代码,但它会更改您的输出(例如:{'a': 1, 'b': 2, 'c': None}):

a = [1, 2]
b = ['a', 'b', 'c']

if len(a) > len(b):
    b += [None]*(len(a)-len(b))
    dic = dict(zip(a, b))
    
elif len(a) < len(b):
    a += [None]*(len(b)-len(a))
    dic = dict(zip(b, a))

else:
    dic = dict(zip(a, b))
    
print(dic)

【讨论】:

  • 如果a = [1],你的代码会输出{1: 'a', None: 'c'},这看起来很可疑。但我想这个问题并不清楚“我们可以拥有任意数量的钥匙”的真正含义。
  • 因为它覆盖了 None 的值并且 finale 以 c 结尾
  • 是的,我知道 - 这就是我指出的原因。我认为你不应该尝试处理len(a) &lt; len(b) 的情况,因为这个问题并没有明确输出应该是什么。
  • 我想是的。我将它们添加为注释,以便他能想到。如有其他错误,请指正!非常感谢您指导我!
【解决方案2】:
def dict_maker(keys, values):
    dict = {}
    for i, key in enumerate(keys):
        try:
            dict[key] = values[i]
        except IndexError:
            dict[key] = None
    return dict

【讨论】:

  • 您好,这不会达到预期的效果。你会得到一个 IndexError 来查看值,因为你没有正确处理长度差异并填充 None。
  • @AryaMcCarthy 已修复
  • 请在您的回答中提供简短的解释
  • 代码转储不能提供好的答案。你应该解释如何为什么这可以解决他们的问题。我推荐阅读,“How do I write a good answer?"
【解决方案3】:

要走的路是使用itertools.zip_longest,正如 cmets 中已经建议的那样。 zip_longest 使用 None 作为最短列表中缺失值的默认值,这正是您想要的:

from itertools import zip_longest

out = dict(zip_longest(A, B))

。您也可以在不导入任何内容的情况下使用zip 来实现此目的,这只会消耗两个列表的共同开始,然后用另一个将第二个列表中的剩余值作为键的字典更新此字典,并将无作为值. dict_fromkeys 默认情况下就是这样构建的:

A = [1, 2, 3, 4, 5]
B = ['a', 'b', 'c']

out = dict(zip(A, B))
out.update(dict.fromkeys(A[len(B):]))

print(out)
# {1: 'a', 2: 'b', 3: 'c', 4: None, 5: None}

【讨论】:

    猜你喜欢
    • 2013-04-23
    • 2020-10-19
    • 1970-01-01
    • 2011-03-14
    • 2013-01-08
    • 1970-01-01
    • 2022-11-22
    • 1970-01-01
    相关资源
    最近更新 更多