使用两个不同来源的键和值的字典理解
Dictionary comprehensions using two different sources for keys and values
我正在尝试通过理解创建字典,但我必须使用来自特定数字范围的键和来自预定义列表的值:
pssmList=[]
for column in columns:
pssmList.append(collections.Counter(column))
pssmDict = {key:value for key in range(0, len(pssmList)) for value in
pssmList}
现在,我知道 Counter 对象是一种字典,但我需要将 pssmDict 内部的那些对象分配给上面指定的数字范围内的键,我得到的只是 pssmList 中的最后一个元素一遍又一遍地重复, 虽然每一行应该不同(是的,我检查了列表,它确实包含不同的记录):
Key Number
0 Counter({'T': 8, 'E': 4, 'P': 2, 'V': 1, 'S': 1, 'D': 1})
1 Counter({'T': 8, 'E': 4, 'P': 2, 'V': 1, 'S': 1, 'D': 1})
2 Counter({'T': 8, 'E': 4, 'P': 2, 'V': 1, 'S': 1, 'D': 1})
3 Counter({'T': 8, 'E': 4, 'P': 2, 'V': 1, 'S': 1, 'D': 1})
4 Counter({'T': 8, 'E': 4, 'P': 2, 'V': 1, 'S': 1, 'D': 1})
5 Counter({'T': 8, 'E': 4, 'P': 2, 'V': 1, 'S': 1, 'D': 1})
期望的输出:
Key Number
0 Counter({'V': 14, 'L': 2, 'A': 1})
1 Counter({'D': 17})
2 Counter({'F': 17})
3 Counter({'S': 8, 'W': 5, 'Y': 3, 'T': 1})
4 Counter({'A': 17})
5 Counter({'T': 8, 'E': 4, 'P': 2, 'V': 1, 'S': 1, 'D': 1})
有谁知道为什么这不起作用?我在 Whosebug 上搜索过类似的问题,但不是我搜索不好,就是没有出现这样的问题。
如果我的错误是微不足道的,请原谅,我已经进入学习 Python(和编码)的第三个月了。
将两个来源压缩在一起:
pssmDict = {key: value for key, value in zip(range(0, len(pssmList)), pssmList)}
但是,在这种情况下,您可以简单地使用 enumerate
来生成密钥。
pssmDict = {key: value for key, value in enumerate(pssmList)}
zip
和enumerate
的结果适合直接传给dict
;无需字典理解:
pssmDict = dict(enumerate(pssmList))
我正在尝试通过理解创建字典,但我必须使用来自特定数字范围的键和来自预定义列表的值:
pssmList=[]
for column in columns:
pssmList.append(collections.Counter(column))
pssmDict = {key:value for key in range(0, len(pssmList)) for value in
pssmList}
现在,我知道 Counter 对象是一种字典,但我需要将 pssmDict 内部的那些对象分配给上面指定的数字范围内的键,我得到的只是 pssmList 中的最后一个元素一遍又一遍地重复, 虽然每一行应该不同(是的,我检查了列表,它确实包含不同的记录):
Key Number
0 Counter({'T': 8, 'E': 4, 'P': 2, 'V': 1, 'S': 1, 'D': 1})
1 Counter({'T': 8, 'E': 4, 'P': 2, 'V': 1, 'S': 1, 'D': 1})
2 Counter({'T': 8, 'E': 4, 'P': 2, 'V': 1, 'S': 1, 'D': 1})
3 Counter({'T': 8, 'E': 4, 'P': 2, 'V': 1, 'S': 1, 'D': 1})
4 Counter({'T': 8, 'E': 4, 'P': 2, 'V': 1, 'S': 1, 'D': 1})
5 Counter({'T': 8, 'E': 4, 'P': 2, 'V': 1, 'S': 1, 'D': 1})
期望的输出:
Key Number
0 Counter({'V': 14, 'L': 2, 'A': 1})
1 Counter({'D': 17})
2 Counter({'F': 17})
3 Counter({'S': 8, 'W': 5, 'Y': 3, 'T': 1})
4 Counter({'A': 17})
5 Counter({'T': 8, 'E': 4, 'P': 2, 'V': 1, 'S': 1, 'D': 1})
有谁知道为什么这不起作用?我在 Whosebug 上搜索过类似的问题,但不是我搜索不好,就是没有出现这样的问题。
如果我的错误是微不足道的,请原谅,我已经进入学习 Python(和编码)的第三个月了。
将两个来源压缩在一起:
pssmDict = {key: value for key, value in zip(range(0, len(pssmList)), pssmList)}
但是,在这种情况下,您可以简单地使用 enumerate
来生成密钥。
pssmDict = {key: value for key, value in enumerate(pssmList)}
zip
和enumerate
的结果适合直接传给dict
;无需字典理解:
pssmDict = dict(enumerate(pssmList))