我可以将数字列表与列表列表一起压缩吗?

时间:2019-11-04 15:09:31

标签: python

我有两个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'],...

我提供的示例是字典。我知道字典不支持重复键,但是我想告诉你我要做什么。

也许元组列表更好?

6 个答案:

答案 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)

您的预期结果似乎是您在寻找列表,但您使用冒号就像是一个字典。根据数据,我认为您需要一个元组列表的列表。在这种情况下,zipitertools.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代替乘法