Повторяющиеся элементы в списке
У меня есть list
в Python:
l = ['a', 'c', 'e', 'b']
Я хочу дублировать каждый элемент сразу рядом с оригиналом.
ll = ['a', 'a', 'c', 'c', 'e', 'e', 'b', 'b']
Порядок элементов должен быть сохранен.
Ответы
Ответ 1
>>> l = ['a', 'c', 'e', 'b']
>>> [x for pair in zip(l,l) for x in pair]
['a', 'a', 'c', 'c', 'e', 'e', 'b', 'b']
или
>>> from itertools import repeat
>>> [x for item in l for x in repeat(item, 2)]
['a', 'a', 'c', 'c', 'e', 'e', 'b', 'b']
Ответ 2
Это старый, но я не вижу простой вариант здесь (IMO):
[ item for item in l for repetitions in range(2) ]
Итак, для конкретного случая:
>>> l = ['a', 'c', 'e', 'b']
l = ['a', 'c', 'e', 'b']
>>> [ i for i in l for r in range(2) ]
[ i for i in l for r in range(2) ]
['a', 'a', 'c', 'c', 'e', 'e', 'b', 'b']
>>>
И обобщая:
[ item for item in l for _ in range(r) ]
Где r - количество повторений, которое вы хотите.
Так что это имеет O (nr) пространственно-временную сложность, коротко, без зависимостей и также идиоматично.
Ответ 3
import itertools
ll = list(itertools.chain.from_iterable((e, e) for e in l))
На работе:
>>> import itertools
>>> l = ['a', 'c', 'e', 'b']
>>> ll = list(itertools.chain.from_iterable((e, e) for e in l))
>>> ll
['a', 'a', 'c', 'c', 'e', 'e', 'b', 'b']
Как отметил Lattyware, если вы хотите больше, чем просто удвоить элемент:
from itertools import chain, repeat
ll = list(chain.from_iterable(repeat(e, 2) for e in l))
Ответ 4
Попробуйте это
for i in l:
ll.append(i)
ll.append(i)
Демо
Он просто сделает вашу работу, но это не оптимизированный способ сделать это.
используйте ан. отправленный @Steven Rumbalski
Ответ 5
Здесь довольно простой способ:
sum(zip(l, l), tuple())
Он дублирует каждый элемент и добавляет их в кортеж. Если вам не нужен кортеж (как я подозреваю), вы можете вызвать list
в кортеже:
list(sum(zip(l, l), tuple()))
Несколько других версий (которые дают списки):
list(sum(zip(l, l), ()))
sum([list(i) for i in zip(l, l)], [])
sum(map(list, zip(l, l)), [])
Ответ 6
Панда дает метод для дублированных элементов:
import pandas as pd
l = pd.Series([2, 1, 3, 1])
print(l.duplicated())
>>>0 False
1 False
2 False
3 True
dtype: bool
print('Has list duplicated ? :', any(l.duplicated()))
>>>Has list duplicated ? : True