【问题标题】:adding each member of an array again, right after itself在其自身之后再次添加数组的每个成员
【发布时间】:2023-12-09 04:05:01
【问题描述】:

如果我有这个 Python 数组:

mac_tags = [ "global_rtgn", "global_mogn" ]

我想要这个 Python 数组:

mac_tags = [ "global_rtgn", "global_rtgn", "global_mogn","global_mogn" ]

如何以编程方式创建它?

【问题讨论】:

  • 为什么你想要那个?只需修改使用列表的任何内容即可复制条目。

标签: python data-structures recursive-datastructures


【解决方案1】:
new_mac_tags = []
for tag in mac_tags:
    new_mac_tags += [tag, tag]

from itertools import chain, izip
new_mac_tags = list(chain.from_iterable(izip(mac_tags, mac_tags)))

【讨论】:

    【解决方案2】:
    >>> [a for a in mac_tags for x in range(2)]
    ['global_rtgn', 'global_rtgn', 'global_mogn', 'global_mogn']
    

    【讨论】:

    • 不打算在这里争论,这只是另一种方式。
    【解决方案3】:

    请注意,这更多是一种功能性的方式,可能不是纯粹的惯用 Python 代码。

    data = [[s, s] for s in [ "global_rtgn", "global_mogn" ]]
    
    data = sum (data, [])
    
    print data
    

    【讨论】:

    • (a) 这似乎是对sum 的滥用 (b) 通过使用 sum,您将失去使用 zip/izip 而不是自己编写的能力。
    • @Marcin:这种方法最糟糕的问题是 O(n^2)。
    • @SvenMarnach:怎么会这样?肯定是一次遍历压缩,加上一次遍历总和。或者你的意思是内存分配将是 O(n^2)? CPython 无法优化这个吗?
    • @Marcin:列表上的+ 运算符创建一个新列表。在这里使用sum() 会在每次迭代中创建一个新列表,复制迄今为止积累的所有内容。可以对此进行优化,但这并非易事,而 CPython 则不然。 sum() 的这种使用被认为是错误的,因此不会对其进行优化。使用带有两个 for 子句或 itertools.chain.from_iterable() 的列表理解被认为是正确的方法。事实上,未来的 Python 版本更有可能拒绝这种对 sum() 的使用(因为他们已经对字符串进行了这种使用),而不是对其进行优化。
    • @SvenMarnach:我理解+ 的python 级语义,但仍然没有理由必须 每次都复制,而不是优化串联。
    【解决方案4】:
    [i for i in sorted(mac_tags+mac_tags)]
    

    【讨论】:

      最近更新 更多