我有一个这样的列表 -
send_recv_pairs = [(['produce_send'], ['consume_recv']), (['Send'], ['Recv']), (['sender2'], ['receiver2'])]
我想要像
这样的东西[ {['produce_send']:['consume_recv']},{['Send']:['Recv']},{['sender2']:['receiver2']}
怎么做?
答案 0 :(得分:4)
您无法使用list
作为dictionary
的关键字。
本文解释了这个概念,
https://wiki.python.org/moin/DictionaryKeys
要用作字典键,对象必须支持哈希函数(例如通过哈希),相等比较(例如通过 eq 或 cmp < / strong>),并且必须满足上述正确性条件。
和
列表不提供有效的哈希方法。
>>> d = {['a']: 1}
TypeError: unhashable type: 'list'
如果您想明确区分键值,可以使用tuple
作为hash able
{ (i[0][0], ): (i[1][0], ) for i in send_recv_pairs}
{('Send',): ('Recv',),
('produce_send',): ('consume_recv',),
('sender2',): ('receiver2',)}
答案 1 :(得分:1)
您不能将列表作为键,只能使用哈希类型 - 字符串,数字,无等。 如果您仍然想要使用字典,那么:
d={}
for tup in send_recv_pairs:
d[tup[0][0]]=tup[1]
如果您希望该值也为字符串,请使用tup[1][0]
代替tup[1]
作为一个班轮:
d={tup[0][0]]:tup[1] for tup in list} #tup[1][0] if you want values as strings
答案 2 :(得分:0)
你可以在这里检查,以第二种方式创建非法。 https://developmentality.wordpress.com/2012/03/30/three-ways-of-creating-dictionaries-in-python/
一种简单的方法,
首先,你的元组是列表的元组,所以最好把它改成字符串元组(我觉得这更有意义)
无论如何,使用当前元组列表的简单方法可以是:
mydict = {}
for i in send_recv_pairs:
print i
mydict[i[0][0]]= i[1][0]
正如其他人所指出的,你不能使用list作为字典的关键。所以术语i[0][0]
首先从元组中取出第一个元素 - 这是一个列表 - 然后是列表的第一个元素,这是你唯一的元素。
答案 3 :(得分:0)
你的意思是这样吗?
send_recv_pairs = [(['produce_send'], ['consume_recv']),
(['Send'], ['Recv']),
(['sender2'], ['receiver2'])]
send_recv_dict = {e[0][0]: e[1][0] for e in send_recv_pairs}
导致......
>>> {'produce_send': 'consume_recv', 'Send': 'Recv', 'sender2': 'receiver2'}
答案 4 :(得分:0)
如其他答案中所述,您不能将列表用作字典键,因为它不可清除(请参阅其他答案中的链接)。
因此,您可以使用列表中的值(假设它们像示例中一样简单)来创建以下两种可能性:
send_recv_pairs = [(['produce_send'], ['consume_recv']), (['Send'], ['Recv']), (['sender2'], ['receiver2'])]
result1 = {}
for t in send_recv_pairs:
result1[t[0][0]] = t[1]
# without any lists
result2 = {}
for t in send_recv_pairs:
result2[t[0][0]] = t[1][0]
分别给出:
>>> result1
{'produce_send': ['consume_recv'], 'Send': ['Recv'], 'sender2': ['receiver2']}
>>> result2
{'produce_send': 'consume_recv', 'Send': 'Recv', 'sender2': 'receiver2'}
答案 5 :(得分:0)
试试这样:
res = { x[0]: x[1] for x in pairs } # or x[0][0]: x[1][0] if you wanna store inner values without list-wrapper
适用于Python 3以及密钥是唯一的。如果您需要收集每个键的值列表而不是单个值,那么您可以使用itertools.groupby
或map + reduce之类的值。在评论中写下这个,我将提供示例。
是的,list不能存储键值,只能存储dict,但也许它只是错字。
答案 6 :(得分:0)
您不能将list
用作字典键,而是可以将其输入为tuple
以创建dict
对象。
以下是使用词典理解的示例示例:
>>> send_recv_pairs = [(['produce_send'], ['consume_recv']), (['Send'], ['Recv']), (['sender2'], ['receiver2'])]
>>> {tuple(k): v for k, v in send_recv_pairs}
{('sender2',): ['receiver2'], ('produce_send',): ['consume_recv'], ('Send',): ['Recv']}
有关详细信息,请查看:Why can't I use a list as a dict key in python?
但是,如果嵌套的元组对不是列表,而是任何其他 hashable 对象对,则可以将其类型化为dict
以获得所需的结果。例如:
>>> my_list = [('key1', 'value1'), ('key2', 'value2')]
>>> dict(my_list)
{'key1': 'value1', 'key2': 'value2'}