【问题标题】:Adding Lists Elements to 'Mega List'将列表元素添加到“超级列表”
【发布时间】:2009-11-19 19:23:40
【问题描述】:

假设我有一个名为majorPowers 的列表,其中包含这两个列表:

axis=["germany","italy","japan"]
allies=["russia","uk","us"]

我想将这些列表的每个元素插入一个新的mega-list。我目前正在这样做:

>>> temp = []
>>> temp = [ww2.append(t) for t in majorPowers]
>>>ww2
[['germany','italy','japan'],['russia','uk','us']]

如何调整它以不使用temp 并将单个元素插入ww2 而不是列表本身(axisallied)。

另外,新的 mega-list 本身是否会被归类为综合列表,或者它的制作过程?

编辑:

请注意我不想这样做:

for a in list1:
    for b in a:
        c.append(b)

@S.Lott。我明白你的意思。但是,我正在尝试学习 Python 中的一些技巧,而不是我通常做事的标准方式。这只是为了让我对 Python 有更多的了解!

【问题讨论】:

  • 您的“我不想做”的解决方案有什么问题? (1) 有效。 (2) 简短而清晰。它有什么问题?
  • python list.extend mean 'for for b in a: c.append(b)'
  • 我只是想指出,您使用 append 的列表理解可以写成 ww2 = [axis,allies] 以产生该结果。下面有一些不错的解决方案,但他们没有提到列表展平,这就是你正在做的。如果您在 Google 上搜索“Python list flatten”,那么您应该会遇到一些感兴趣的讨论。

标签: python list


【解决方案1】:

你问这个问题很好,因为滥用列表是不好的形式 之类的理解。您显示的代码使用append,而不是生成 temp 的元素,但是因为它的副作用。 避免列表中的副作用 理解

所以,您可以做几件事。首先,您可以使用 itertools.chain:

>>> from itertools import chain
>>> list(chain(*mayorPowers))
['germany', 'italy', 'japan', 'russia', 'uk', 'us']

除了将mayorPowers 的元素作为单独的参数传递给chain,您还可以使用itertools.chain.from_iterable

>>> list(chain.from_iterable(mayorPowers))
['germany', 'italy', 'japan', 'russia', 'uk', 'us']

或者你可以使用extend:

>>> ww2 = []
>>> for mp in mayorPowers:
...     ww2.extend(mp)
...
>>> ww2
['germany', 'italy', 'japan', 'russia', 'uk', 'us']

或者sum(我想我最喜欢这个):

>>> sum(mayorPowers, [])
['germany', 'italy', 'japan', 'russia', 'uk', 'us']

或者,有点疯狂(使用functools.reduceoperator.add),

>>> from functools import reduce
>>> from operator import add
>>> reduce(add, mayorPowers)
['germany', 'italy', 'japan', 'russia', 'uk', 'us']

【讨论】:

  • 我认为你不需要导入 reduce - 我认为 reducemap 是内置的(至少从 2.5 开始)
  • @thrope:在 2.x 中是的,但在 3.x 中没有。 (reduce 经常被滥用。正如你所看到的,在这个例子中,它也不是首选方法。)
  • Stephan202,您总是提供详尽、写得很好的答案。非常感激! :)
【解决方案2】:
from itertools import chain
ww2 = list(chain.from_iterable(majorPower))

【讨论】:

  • 或者,由于市长权力的数量是有限的,list(chain(*mayorPowers))
  • 使用itertools有什么问题?
  • 在 2.6 中也引入了 from_iterable
  • 当某些事情可以用更简单的方式完成并且适用于所有版本时,我会选择简单和更短的版本
  • 但我不明白为什么我的答案是错误的 - 它不值得被否决
【解决方案3】:

尝试扩展

for t in majorPowers: ww2.extend(t)

sum(majorPowers,[])

【讨论】:

    【解决方案4】:

    我会使用reduce:

    from operator import add
    ww2 = reduce(add, majorPowers)
    

    【讨论】:

      猜你喜欢
      • 2014-06-16
      • 1970-01-01
      • 2017-09-09
      • 2016-06-02
      • 1970-01-01
      相关资源
      最近更新 更多