我有两个python列表:
第一个列表包含8个数字:
['4554176', '4554178', '4555289', '4555522', '4555661', '4555693', '4555695', '4556068']
第二个列表是8个列表的列表:
[['dune', 'pro', 'pc', 'case'] ['apple', 'typische', 'kaesereiben', 'muster'] ['orientiert', 'profi', 'mac', 'mac'] ['handel', 'hersteller', 'pc', 'gehaeusen'] ['optik', 'kaesereibe', 'nutzer', 'ueberarbeitete', 'apple'] ['design', 'geklont', 'nennt', 'dune', 'pc'] ['oktober', 'form', 'kickstarter', 'projekts', 'realitaet'] ['annehmen', 'preise', 'genannt', 'signifikant']]
我想将第一个列表的编号与列表中相应列表的每个元素一起压缩。
示例:
[['4554176':'dune', '4554176':'pro', '4554176':'pc', '4554176':'case'],...
我提供的示例是字典。我知道字典不支持重复键,但是我想告诉你我要做什么。
也许元组列表更好?
答案 0 :(得分:2)
给予
numbers = ['4554176', '4554178', '4555289', '4555522', '4555661', '4555693', '4555695', '4556068']
lists = [
['dune', 'pro', 'pc', 'case'],
['apple', 'typische', 'kaesereiben', 'muster'],
['orientiert', 'profi', 'mac', 'mac'],
['handel', 'hersteller', 'pc', 'gehaeusen'],
['optik', 'kaesereibe', 'nutzer', 'ueberarbeitete', 'apple'],
['design', 'geklont', 'nennt', 'dune', 'pc'],
['oktober', 'form', 'kickstarter', 'projekts', 'realitaet'],
['annehmen', 'preise', 'genannt', 'signifikant']
]
列表理解将起作用:
result = [(n,word) for (n,l) in zip(numbers, lists) for word in l]
输出
[ ('4554176', 'dune'), ('4554176', 'pro'), ('4554176', 'pc'), ('4554176', 'case'), ('4554178', 'apple'), ('4554178', 'typische'), ('4554178', 'kaesereiben'), ('4554178', 'muster'), ('4555289', 'orientiert'), ('4555289', 'profi'), ('4555289', 'mac'), ('4555289', 'mac'), ('4555522', 'handel'), ('4555522', 'hersteller'), ('4555522', 'pc'), ('4555522', 'gehaeusen'), ('4555661', 'optik'), ('4555661', 'kaesereibe'), ('4555661', 'nutzer'), ('4555661', 'ueberarbeitete'), ('4555661', 'apple'), ('4555693', 'design'), ('4555693', 'geklont'), ('4555693', 'nennt'), ('4555693', 'dune'), ('4555693', 'pc'), ('4555695', 'oktober'), ('4555695', 'form'), ('4555695', 'kickstarter'), ('4555695', 'projekts'), ('4555695', 'realitaet'), ('4556068', 'annehmen'), ('4556068', 'preise'), ('4556068', 'genannt'), ('4556068', 'signifikant'), ]
编辑:,或者,如果要嵌套输出:
result = [[(n,word) for word in l] for (n,l) in zip(numbers, lists)]
输出:
[ [('4554176', 'dune'), ('4554176', 'pro'), ('4554176', 'pc'), ('4554176', 'case')], [('4554178', 'apple'), ('4554178', 'typische'), ('4554178', 'kaesereiben'), ('4554178', 'muster')], [('4555289', 'orientiert'), ('4555289', 'profi'), ('4555289', 'mac'), ('4555289', 'mac')], [('4555522', 'handel'), ('4555522', 'hersteller'), ('4555522', 'pc'), ('4555522', 'gehaeusen')], [('4555661', 'optik'), ('4555661', 'kaesereibe'), ('4555661', 'nutzer'), ('4555661', 'ueberarbeitete'), ('4555661', 'apple')], [('4555693', 'design'), ('4555693', 'geklont'), ('4555693', 'nennt'), ('4555693', 'dune'), ('4555693', 'pc')], [('4555695', 'oktober'), ('4555695', 'form'), ('4555695', 'kickstarter'), ('4555695', 'projekts'), ('4555695', 'realitaet')], [('4556068', 'annehmen'), ('4556068', 'preise'), ('4556068', 'genannt'), ('4556068', 'signifikant')], ]
答案 1 :(得分:2)
您的预期结果似乎是您在寻找列表,但您使用冒号就像是一个字典。根据数据,我认为您需要一个元组列表的列表。在这种情况下,zip
和itertools.repeat
是您的朋友。
list1 = ['4554176', '4554178', '4555289', '4555522', '4555661', '4555693', '4555695', '4556068']
list2 = [['dune', 'pro', 'pc', 'case'], ['apple', 'typische', 'kaesereiben', 'muster'], ['orientiert', 'profi', 'mac', 'mac'], ['handel', 'hersteller', 'pc', 'gehaeusen'], ['optik', 'kaesereibe', 'nutzer', 'ueberarbeitete', 'apple'], ['design', 'geklont', 'nennt', 'dune', 'pc'], ['oktober', 'form', 'kickstarter', 'projekts', 'realitaet'], ['annehmen', 'preise', 'genannt', 'signifikant']]
result = [list(zip(repeat(s), l)) for s, l in zip(list1, list2)]
结果:
[[('4554176', 'dune'), ('4554176', 'pro'), ('4554176', 'pc'), ('4554176', 'case')], [('4554178', 'apple'), ('4554178', 'typische'), ('4554178', 'kaesereiben'), ('4554178', 'muster')], [('4555289', 'orientiert'), ('4555289', 'profi'), ('4555289','mac'), ('4555289', 'mac')], [('4555522', 'handel'), ('4555522', 'hersteller'), ('4555522', 'pc'), ('4555522', 'gehaeusen')], [('4555661', 'optik'), ('4555661', 'kaesereibe'), ('4555661', 'nutzer'), ('4555661', 'ueberarbeitete'), ('4555661', 'apple')], [('4555693', 'design'), ('4555693', 'geklont'), ('4555693', 'nennt'), ('4555693', 'dune'), ('4555693', 'pc')], [('4555695', 'oktober'), ('4555695', 'form'),('4555695', 'kickstarter'), ('4555695', 'projekts'), ('4555695', 'realitaet')], [('4556068', 'annehmen'), ('4556068', 'preise'), ('4556068', 'genannt'), ('4556068', 'signifikant')]]
P.S:list2
在上面我解决的每个子列表之间都缺少逗号。
也许元组列表更好?
恕我直言:您可能真的希望为此数据使用dict
,因为以上对于所代表的数据来说是过分的。另外,转换起来会更加简单。
result = dict(zip(list1, list2))
结果:
{'4554176': ['dune', 'pro', 'pc', 'case'], '4554178': ['apple', 'typische', 'kaesereiben', 'muster'], '4555289': ['orientiert', 'profi', 'mac', 'mac'], '4555522': ['handel', 'hersteller', 'pc', 'gehaeusen'], '4555661': ['optik', 'kaesereibe', 'nutzer', 'ueberarbeitete', 'apple'], '4555693': ['design', 'geklont', 'nennt', 'dune', 'pc'], '4555695': ['oktober', 'form', 'kickstarter', 'projekts', 'realitaet'], '4556068': ['annehmen', 'preise', 'genannt', 'signifikant']}
尽管如果要获取元组列表,则只需使用我的第一种方法并将其包装在itertools.chain
中即可:
result = list(chain(*(list(zip(repeat(s), l)) for s, l in zip(list1, list2))))
结果:
[('4554176', 'dune'), ('4554176', 'pro'), ('4554176', 'pc'), ('4554176', 'case'), ('4554178', 'apple'), ('4554178', 'typische'), ('4554178', 'kaesereiben'), ('4554178', 'muster'), ('4555289', 'orientiert'), ('4555289', 'profi'), ('4555289', 'mac'), ('4555289', 'mac'), ('4555522', 'handel'), ('4555522', 'hersteller'), ('4555522', 'pc'), ('4555522', 'gehaeusen'), ('4555661', 'optik'), ('4555661', 'kaesereibe'), ('4555661', 'nutzer'), ('4555661', 'ueberarbeitete'), ('4555661', 'apple'), ('4555693', 'design'), ('4555693', 'geklont'), ('4555693', 'nennt'), ('4555693', 'dune'), ('4555693', 'pc'), ('4555695', 'oktober'), ('4555695', 'form'), ('4555695', 'kickstarter'), ('4555695', 'projekts'), ('4555695', 'realitaet'), ('4556068', 'annehmen'), ('4556068', 'preise'), ('4556068', 'genannt'), ('4556068', 'signifikant')]
其他,这是除字典结果以外的两种方法的功能性方法。 (它们需要itertools.starmap
仅供参考)
list
个(共list
个
list(map(list, starmap(zip, zip(map(repeat, list1), list2))))
list
个(共tuple
个
list(chain(*starmap(zip, zip(map(repeat, list1), list2))))
答案 2 :(得分:1)
为第一个列表的每个项目(重复4次)创建临时列表,然后为第二个列表的第一个列表创建zip
。
[list(zip([l1[i]]*len(l2[i]), l2[i])) for i in range(len(l2))]
答案 3 :(得分:1)
Python不支持重复键。但是也许您可以使它们成为键数组字典?
a = ['4554176', '4554178', '4555289', '4555522', '4555661', '4555693', '4555695', '4556068']
b = [['dune', 'pro', 'pc', 'case'], ['apple', 'typische', 'kaesereiben', 'muster'], ['orientiert', 'profi', 'mac', 'mac'], ['handel', 'hersteller', 'pc', 'gehaeusen'], ['optik', 'kaesereibe', 'nutzer', 'ueberarbeitete', 'apple'], ['design', 'geklont', 'nennt', 'dune', 'pc'], ['oktober', 'form', 'kickstarter', 'projekts', 'realitaet'], ['annehmen', 'preise', 'genannt', 'signifikant']]
c = {}
for i in range(len(a)):
c[a[i]] = b[i]
print(c)
输出:{'4555289': ['orientiert', 'profi', 'mac', 'mac'], '4555693': ['design', 'geklont', 'nennt', 'dune', 'pc'], '4555522': ['handel', 'hersteller', 'pc', 'gehaeusen'], '4556068': ['annehmen', 'preise', 'genannt', 'signifikant'], '4554176': ['dune', 'pro', 'pc', 'case'], '4555695': ['oktober', 'form', 'kickstarter', 'projekts', 'realitaet'], '4555661': ['optik', 'kaesereibe', 'nutzer', 'ueberarbeitete', 'apple'], '4554178': ['apple', 'typische', 'kaesereiben', 'muster']}
或者,也许是一系列微小的字典:
a = ['4554176', '4554178', '4555289', '4555522', '4555661', '4555693', '4555695', '4556068']
b = [['dune', 'pro', 'pc', 'case'], ['apple', 'typische', 'kaesereiben', 'muster'], ['orientiert', 'profi', 'mac', 'mac'], ['handel', 'hersteller', 'pc', 'gehaeusen'], ['optik', 'kaesereibe', 'nutzer', 'ueberarbeitete', 'apple'], ['design', 'geklont', 'nennt', 'dune', 'pc'], ['oktober', 'form', 'kickstarter', 'projekts', 'realitaet'], ['annehmen', 'preise', 'genannt', 'signifikant']]
c = []
for i in range(len(a)):
key = a[i]
for j in range(len(b[i])):
c.append({ a[i]: b[i][j] })
print(c)
输出:[{'4554176': 'dune'}, {'4554176': 'pro'}, {'4554176': 'pc'}, {'4554176': 'case'}, {'4554178': 'apple'}, {'4554178': 'typische'}, {'4554178': 'kaesereiben'}, {'4554178': 'muster'}, {'4555289': 'orientiert'}, {'4555289': 'profi'}, {'4555289': 'mac'}, {'4555289': 'mac'}, {'4555522': 'handel'}, {'4555522': 'hersteller'}, {'4555522': 'pc'}, {'4555522': 'gehaeusen'}, {'4555661': 'optik'}, {'4555661': 'kaesereibe'}, {'4555661': 'nutzer'}, {'4555661': 'ueberarbeitete'}, {'4555661': 'apple'}, {'4555693': 'design'}, {'4555693': 'geklont'}, {'4555693': 'nennt'}, {'4555693': 'dune'}, {'4555693': 'pc'}, {'4555695': 'oktober'}, {'4555695': 'form'}, {'4555695': 'kickstarter'}, {'4555695': 'projekts'}, {'4555695': 'realitaet'}, {'4556068': 'annehmen'}, {'4556068': 'preise'}, {'4556068': 'genannt'}, {'4556068': 'signifikant'}]
答案 4 :(得分:0)
您可以在列表理解中使用函数product()
:
from itertools import product
lst1 = list('123')
lst2 = [list('ab'), list('cd'), list('ef')]
[list(product(*i)) for i in zip(lst1, lst2)]
# [[('1', 'a'), ('1', 'b')], [('2', 'c'), ('2', 'd')], [('3', 'e'), ('3', 'f')]]
答案 5 :(得分:0)
我喜欢itertools.product
与内部zip
的组合。
import itertools
v1 =['4554176', '4554178', '4555289']
v2 = [
['dune', 'pro', 'pc', 'case'],
['apple', 'typische', 'kaesereiben', 'muster'],
['orientiert', 'profi', 'mac', 'mac'],
]
result = [list(itertools.product([x], y)) for (x, y) in zip(v1, v2)]
print(result)
这类似于@ beer44的答案,除了product
用4代替乘法