简体   繁体   English

Python元组列表,其中包含要指定的键值

[英]Python list of tuples with key values to dict

I am having a hard time trying to convert a list of tuples, with key, values to a dictionary. 我很难将包含键的元组列表转换为字典。

I have a list of tuples: 我有一个元组列表:

[('season', '1', 'episode', '1', 'showkey', '1736'),
('season', '1', 'episode', '2', 'showkey', '1737'),
('season', '1', 'episode', '3', 'showkey', '1738'),
('season', '1', 'episode', '4', 'showkey', '1739'),
('season', '1', 'episode', '5', 'showkey', '1740'),
('season', '1', 'episode', '6', 'showkey', '1741'),
('season', '1', 'episode', '7', 'showkey', '1742'),
('season', '1', 'episode', '8', 'showkey', '1743'),
('season', '1', 'episode', '9', 'showkey', '1744'),
('season', '1', 'episode', '10', 'showkey', '1745'),
('season', '1', 'episode', '11', 'showkey', '1746'),
('season', '1', 'episode', '12', 'showkey', '1747'),
('season', '1', 'episode', '13', 'showkey', '1748')]

how can I make a dictionary with the key value pairs like: 我该如何用键值对制作字典:

{'season':1, 'episode':2, 'showkey':1736}

Thanks for any help! 谢谢你的帮助!

If you want one dictionary for each tuple: 如果要为每个元组使用一本字典:

>>> i = ('season', '1', 'episode', '2', 'showkey', '1737')
>>> dict(zip(i[::2], i[1::2]))
{'season': '1', 'episode': '2', 'showkey': '1737'}

To expand this for your list: 要将其扩展为您的列表:

new_list = [dict(zip(i[::2], i[1::2])) for i in list_of_data]

This works by combining the following facts: 通过结合以下事实来起作用:

  1. The dict() constructor takes an iterable of pairs which it can convert to key/value. dict()构造函数采用一对可迭代的对,可以将其转换为键/值。
  2. zip() will return tuples pairs from the two iterables passed to it. zip()将返回传递给它的两个可迭代对象的元组对。
  3. Slicing allows you add a starting offset, and a step argument. 切片允许您添加起始偏移量和step参数。

Combining the above: 结合以上内容:

  1. First, we slice the tuple by odd positions i[::2] then by even positions, by skipping the first element i[1::2] , this gives us two lists one representing the keys, the second the values: 首先,通过跳过第一个元素i[1::2] ,通过奇数位置i[::2]剪切元组,然后通过偶数位置对元组进行切片,这给出了两个代表键的列表,第二个代表值:

     >>> i[::2] ('season', 'episode', 'showkey') >>> i[1::2] ('1', '2', '1737') 
  2. Next, we feed these two lists to zip to give us (key,value) pairs: 接下来,我们将这两个列表压缩以提供给我们(键,值)对:

     >>> zip(i[::2], i[1::2]) [('season', '1'), ('episode', '2'), ('showkey', '1737')] 
  3. Finally, we pass the resulting list to the dict() constructor: 最后,我们将结果列表传递给dict()构造函数:

     >>> dict([('season', '1'), ('episode', '2'), ('showkey', '1737')]) {'season': '1', 'episode': '2', 'showkey': '1737'} 

I would use a list comprehension, and in that create dicts from the tuple by taking each 2 consecutive elements in it. 我将使用列表推导,通过将元组中的每个2个连续元素从元组中创建字典。

Code - 代码-

d = [dict((i[j],i[j+1]) for j in range(0,len(i),2)) for i in lt]

Here lt is the list of tuples . 这里lt是元组的列表。

Example - 范例-

>>> lt = [('season', '1', 'episode', '1', 'showkey', '1736'),
... ('season', '1', 'episode', '2', 'showkey', '1737'),
... ('season', '1', 'episode', '3', 'showkey', '1738'),
... ('season', '1', 'episode', '4', 'showkey', '1739'),
... ('season', '1', 'episode', '5', 'showkey', '1740'),
... ('season', '1', 'episode', '6', 'showkey', '1741'),
... ('season', '1', 'episode', '7', 'showkey', '1742'),
... ('season', '1', 'episode', '8', 'showkey', '1743'),
... ('season', '1', 'episode', '9', 'showkey', '1744'),
... ('season', '1', 'episode', '10', 'showkey', '1745'),
... ('season', '1', 'episode', '11', 'showkey', '1746'),
... ('season', '1', 'episode', '12', 'showkey', '1747'),
... ('season', '1', 'episode', '13', 'showkey', '1748')]
>>>
>>> d= [dict((i[j],i[j+1]) for j in range(0,len(i),2)) for i in lt]
>>> d
[{'showkey': '1736', 'episode': '1', 'season': '1'}, {'showkey': '1737', 'episode': '2', 'season': '1'}, {'showkey': '1738', 'episode': '3', 'season': '1'}, {'showkey': '1739', 'episode': '4', 'season': '1'}, {'showkey': '1740', 'episode':
 'season': '1'}, {'showkey': '1744', 'episode': '9', 'season': '1'}, {'showkey': '1745', 'episode': '10', 'season': '1'}, {'showkey': '1746', 'episode': '11', 'season': '1'}, {'showkey': '1747', 'episode': '12', 'season': '1'}, {'showkey':
map(lambda datum: dict(zip(datum[::2], datum[1::2])), data)

In slow-mo: 在慢动作中:

results = []
for datum in data:
    # pick off every alternate item from the tuple, starting with the zeroth.
    keys = datum[::2]
    # pick off every alternate item from the tuple, starting with the oneth.
    values = datum[1::2]
    kv = zip(keys, values)
    new_dict = dict(kv)
    results.append(new_dict)

Please excuse typos, typing this on my phone. 请原谅错字,在我的手机上输入。

x=[('season', '1', 'episode', '1', 'showkey', '1736'),
('season', '1', 'episode', '2', 'showkey', '1737'),
('season', '1', 'episode', '3', 'showkey', '1738'),
('season', '1', 'episode', '4', 'showkey', '1739'),
 ('season', '1', 'episode', '5', 'showkey', '1740'),
  ('season', '1', 'episode','6', 'showkey', '1741'),
 ('season', '1', 'episode', '7', 'showkey', '1742'),
('season', '1', 'episode', '8', 'showkey', '1743'),
('season', '1', 'episode', '9', 'showkey', '1744'),
('season', '1', 'episode', '10', 'showkey', '1745'),
('season', '1', 'episode', '11', 'showkey', '1746'),
('season', '1', 'episode', '12', 'showkey', '1747'),
('season', '1', 'episode', '13', 'showkey', '1748')]
d={}
m=0
for i in x:
    d1={}
    for j in i[::2]:

        d1[j]=i[i.index(j)+1]

    d[m]=d1
    m=m+1

print d

You can create dictionary of dictionary to save all data. 您可以创建字典的字典以保存所有数据。

inputd = [('season', '1', 'episode', '1', 'showkey', '1736'),
('season', '1', 'episode', '2', 'showkey', '1737'),
('season', '1', 'episode', '3', 'showkey', '1738'),
('season', '1', 'episode', '4', 'showkey', '1739'),
('season', '1', 'episode', '5', 'showkey', '1740'),
('season', '1', 'episode', '6', 'showkey', '1741'),
('season', '1', 'episode', '7', 'showkey', '1742'),
('season', '1', 'episode', '8', 'showkey', '1743'),
('season', '1', 'episode', '9', 'showkey', '1744'),
('season', '1', 'episode', '10', 'showkey', '1745'),
('season', '1', 'episode', '11', 'showkey', '1746'),
('season', '1', 'episode', '12', 'showkey', '1747'),
('season', '1', 'episode', '13', 'showkey', '1748')]


>>> map(dict, map(lambda x: zip(x[::2],x[1::2]), inputd))
[{'season': '1', 'episode': '1', 'showkey': '1736'}, {'season': '1', 'episode': '2', 'showkey': '1737'}, {'season': '1', 'episode': '3', 'showkey': '1738'}, {'season': '1', 'episode': '4', 'showkey': '1739'}, {'season': '1', 'episode': '5', 'showkey': '1740'}, {'season': '1', 'episode': '6', 'showkey': '1741'}, {'season': '1', 'episode': '7', 'showkey': '1742'}, {'season': '1', 'episode': '8', 'showkey': '1743'}, {'season': '1', 'episode': '9', 'showkey': '1744'}, {'season': '1', 'episode': '10', 'showkey': '1745'}, {'season': '1', 'episode': '11', 'showkey': '1746'}, {'season': '1', 'episode': '12', 'showkey': '1747'}, {'season': '1', 'episode': '13', 'showkey': '1748'}]

About python slice 关于python slice

  1. x[::2] - means start through end, skipping ahead 2 places each time x[::2] -表示从头到尾,每次跳过2个位置
  2. x[1::2] - means, start on index 1 through end, skipping ahead 2 places each time x[1::2] -表示从索引1开始到结束,每次向前跳过2个位置

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM