如何将包含两个列表的元组列表转换为键值对的字典?

时间:2017-07-20 10:11:30

标签: python

我有一个这样的列表 -

send_recv_pairs = [(['produce_send'], ['consume_recv']), (['Send'], ['Recv']), (['sender2'], ['receiver2'])]

我想要像

这样的东西
[ {['produce_send']:['consume_recv']},{['Send']:['Recv']},{['sender2']:['receiver2']}

怎么做?

7 个答案:

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