簡體   English   中英

在列表中的每個項目之后插入一個項目(Python)

[英]Inserting an item after each item in a list (Python)

說我有一個這樣的清單:

a = [[1, 2, 3], [4, 5, 6]]
filler = ['cat']

我怎么能

b = [[1 ,2 ,3], ['cat'], [4, 5, 6], ['cat']] 

作為輸出?

我更喜歡使用itertools這樣的東西:

>>> import itertools as it
>>> a = [[1, 2, 3], [4, 5, 6]]
>>> filler = ['cat']
>>> list(it.chain.from_iterable(it.izip(a, it.repeat(filler))))
[[1, 2, 3], ['cat'], [4, 5, 6], ['cat']]

我喜歡這里發布的基於itertools的解決方案,但這是一種不需要列表itertoolsitertools ,我敢打賭它的速度非常快。

new_list = [filler] * (len(a) * 2)
new_list[0::2] = a

不是pythonic,但似乎可以工作。

list = [[1, 2, 3], [4, 5, 6]]
result = []
for e in list:
    result.append(e)
    result.append(['cat'])
result.pop()

在此職位上找到: 在列表中已存在的每個項目之間添加一個項目

這是一個主意:

import itertools

a = [[1, 2, 3], [4, 5, 6]]
filler = ['cat']
print list(itertools.chain.from_iterable(zip(a, [filler] * len(a))))

輸出:

[[1, 2, 3], ['cat'], [4, 5, 6], ['cat']]

使用itertools.islice()itertools.cycle()這樣的事情:

cycle()是用於重復的項目,以及用於islice()切repeatation的數目len(a)然后用izip()或簡單的zip()超過a ,並通過返回的迭代器islice()這將返回元組列表。

然后可以使用itertools.chain()將其展平。

In [72]: a
Out[72]: [[1, 2, 3], [4, 5, 6]]

In [73]: b
Out[73]: ['cat']

In [74]: cyc=islice(cycle(b),len(a))

In [75]: lis=[]

In [76]: for x in a:
    lis.append(x)
    lis.append([next(cyc)])
   ....:     

In [77]: lis
Out[77]: [[1, 2, 3], ['cat'], [4, 5, 6], ['cat']]

要么:

In [108]: a
Out[108]: [[1, 2, 3], [4, 5, 6]]

In [109]: b
Out[109]: ['cat']

In [110]: cyc=islice(cycle(b),len(a))

In [111]: list(chain(*[(x,[y]) for x,y in izip(a,cyc)]))
Out[111]: [[1, 2, 3], ['cat'], [4, 5, 6], ['cat']]
a = [[1, 2, 3], [4, 5, 6]]
filler = ['cat']
out = []

for i in a:
    out.append(i)
    out.append(filler)
result = [si for i in zip(a, [filler]*len(a)) for si in i]

一口氣嘗試一下:

from operator import add
a = [[1, 2, 3], [4, 5, 6]]
filler = ['cat']

reduce(add, ([x, filler] for x in a))
> [[1, 2, 3], ['cat'], [4, 5, 6], ['cat']]

甚至更簡單,無需使用reduce

sum(([x, filler] for x in a), [])
> [[1, 2, 3], ['cat'], [4, 5, 6], ['cat']]

兩種解決方案的作用都相同:首先,創建[element, filler]的生成器,然后展平生成的對對。 為了提高效率,第一步是使用生成器執行以避免不必要的中間列表。

更新:

這篇文章是一個教科書示例,說明了為什么不得在在線論壇中喂食巨魔。 查看評論以了解我的意思。 最好不理會巨魔。

    python 3.2

    a = [[1, 2, 3], [4, 5, 6]]
    b = ['cat']
    _=[a.insert(x,b) for x in range(1,len(a)*2,2)]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM