【问题标题】:Pythonic Way to Sum List of Lists of Strings [duplicate]对字符串列表求和的Pythonic方法[重复]
【发布时间】:2013-07-25 14:06:39
【问题描述】:

我找到了一种方法来做我想做的事,但我想知道是否有一种方法可以将其简化为一行。

与数字列表相比,我有一个字符串列表列表(对此有一个答案:[列表总和;返回总和列表)

示例列表:

list = [['T=-40F A=0K', 'T=-15F A=0K', 'T=59F A=0K', 'T=98F A=0K', 'T=120F A=0K'],
 ['T=-40F A=10K','T=-15F A=10K','T=59F A=10K','T=98F A=10K','T=120F A=10K']]

示例输出:

['T=-40F A=0K', 'T=-15F A=0K', 'T=59F A=0K', 'T=98F A=0K', 'T=120F A=0K', 'T=-40F A=10K', 'T=-15F A=10K', 'T=59F A=10K', 'T=98F A=10K', 'T=120F A=10K']

我可以用这个方法加入这些:

new = []
for i in [['T=%.0fF A=%.0fK'%(t,a)for t in TEMP] for a in ALT]:
    new = new + i

有人收到了吗?

至于应用程序我在 matplotlib 图中添加图例

这真的很简单,而且 sum(list) 的一个很棒的功能

【问题讨论】:

  • 你的输入和你的输出是如何对应的?你想用new = []new = new + 1 做什么?
  • @Inbar Rose:我不确定它是否重复,因为所有这些答案都是多行的。
  • @hivert :我正在寻找更像 Rohit Jain 提供的东西......没有必要导入任何东西
  • @CodeMode 导入模块不是你应该避免的——模块的存在是有原因的。它们为您提供了更好、更快的实现。
  • @CodeMode:Rohit Jain 的代码与stackoverflow.com/questions/406121/… 中的comprehension_flatten 相同。

标签: python string list nested


【解决方案1】:

使用列表理解

>>> my_list = [['T=-40F A=0K', 'T=-15F A=0K', 'T=59F A=0K', 'T=98F A=0K', 'T=120F A=0K'], ['T=-40F A=10K','T=-15F A=10K','T=59F A=10K','T=98F A=10K','T=120F A=10K']]
>>>
>>> [y for x in my_list for y in x]
['T=-40F A=0K', 'T=-15F A=0K', 'T=59F A=0K', 'T=98F A=0K', 'T=120F A=0K', 'T=-40F A=10K', 'T=-15F A=10K', 'T=59F A=10K', 'T=98F A=10K', 'T=120F A=10K']

你不应该使用list作为你的变量名。

【讨论】:

  • 请注意,与itertools.chain.from_iterable()相比,此任务的列表组合会更慢(并且可读性更低)。
  • 意识到这一点,但我的名单相当小。我更倾向于减少总程序大小,我宁愿不导入任何东西
  • @CodeMode 一行代码的大小无关紧要 - 但是它会使您的代码更具可读性和效率。
  • @CodeMode。请不要害怕导入模块。 itertools 就是这样一个珍贵的模块,你不会想错过的,如此有用和高效的功能it provides。你应该学习使用库。他们在那里是出于某种原因。
  • 无论哪种情况,谢谢你们!它们都是很棒的解决方案,真的可以帮助我完成工程工作!
【解决方案2】:

您想要展平可迭代 - itertools.chain.from_iterable() 就是为此目的而存在的:

>>> data = ...
>>> import itertools
>>> list(itertools.chain.from_iterable(data))
['T=-40F A=0K', 'T=-15F A=0K', 'T=59F A=0K', 'T=98F A=0K', 'T=120F A=0K', 'T=-40F A=10K', 'T=-15F A=10K', 'T=59F A=10K', 'T=98F A=10K', 'T=120F A=10K']

它返回一个迭代器,所以如果你需要一个列表,你可以使用list(),或者只使用迭代器。

【讨论】:

    【解决方案3】:

    您可以使用itertools.chain() 展平列表。

    >>> testList =[['T=-40F A=0K', 'T=-15F A=0K', 'T=59F A=0K', 'T=98F A=0K', 'T=120F A=0K'],
     ['T=-40F A=10K','T=-15F A=10K','T=59F A=10K','T=98F A=10K','T=120F A=10K']]
    >>> 
    >>> from itertools import chain
    >>> chain(*testList)
    <itertools.chain object at 0x02B1E910>
    >>> list(chain(*testList))
    ['T=-40F A=0K', 'T=-15F A=0K', 'T=59F A=0K', 'T=98F A=0K', 'T=120F A=0K', 'T=-40F A=10K', 'T=-15F A=10K', 'T=59F A=10K', 'T=98F A=10K', 'T=120F A=10K']
    

    使用itertools.chain.from_iterable()

    >>> list(chain.from_iterable(testList))
    ['T=-40F A=0K', 'T=-15F A=0K', 'T=59F A=0K', 'T=98F A=0K', 'T=120F A=0K', 'T=-40F A=10K', 'T=-15F A=10K', 'T=59F A=10K', 'T=98F A=10K', 'T=120F A=10K']
    

    P.S - 请不要使用list 作为变量名,它会影响内置函数。

    【讨论】:

    • 使用* 解压列表效率低下——from_iterable() 就是为此目的。
    • 谢谢!很好的回应我应该阅读列表理解
    • 不知道。感谢您的评论。将其添加到答案中。 :)
    • @CodeMode 这里没有list comprehension
    • @CodeMode : Rohit Jain 的回答中使用了列表理解。
    【解决方案4】:

    试试itertools.chain.fromiterable() -

    from itertools import chain
    result = list(chain.from_iterable(your_list))
    

    【讨论】:

      猜你喜欢
      • 2012-08-02
      • 2017-12-17
      • 1970-01-01
      • 1970-01-01
      • 2020-08-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多