создать дубликат элемента дублирования в понимании списка в python - PullRequest
0 голосов
/ 28 апреля 2018

Я хочу создать элемент дублирования в понимании списка в python

В Python вы можете иметь несколько итераторов в понимании списка, например

[(x,y) for x in a for y in b]

для некоторых подходящих последовательностей a и b. Я знаю о семантике цикла в списках Python.

Мой вопрос: может ли итератор в понимании ссылаться на другого? Другими словами: могу ли я иметь что-то вроде этого:

arr = [1,2,3,4]
dubs = []
dubs = [[x] + [arr[arr.index(x)]] for x in ]
dubs = [x for l in dubs for x in l]

Например, если у меня есть простой список:

arr = [1,2,3,4]

Каким будет выражение понимания списка для достижения этого результата:

dubs = [1, 1, 2, 2, 3, 3, 4, 4]

Пожалуйста, перечисляйте только ответы на понимание.

Ответы [ 3 ]

0 голосов
/ 28 апреля 2018

Если вы хотите изменить существующий код, чтобы он работал, сначала создайте вложенный список, а затем сгладьте его:

dubs = [[x]+[x] for x in arr]
dubs = [x for l in dubs for x in l]

Другими словами, то, что вам нужно зациклить (то, что вы, казалось, застряли) - это просто элемент arr, а то, что вам нужно добавить к каждому элементу singleton [x], это просто еще одна копия [x]. С вашим [arr[arr.index(x)]] вы пытаетесь найти x в массиве только для того, чтобы вы могли вернуть значение того, что вы нашли - которое просто будет x, если оно будет работать, поэтому просто используйте x.


Вы можете сделать это немного лучше:

dubs = [[x]*2 for x in arr]
dubs = [x for l in dubs for x in l]

Или, конечно:

dubs = [[x,x] for x in arr]
dubs = [x for l in dubs for x in l]

Но, вероятно, проще, хотя и менее кратко, сделать это:

dubs = [[x for _ in range(2)] for x in arr]
dubs = [x for l in dubs for x in l]

И затем, как указал jpp в комментарии, вы можете упростить это до:

dubs = [x for x in arr for _ in range(2)]

Или, альтернативно, обратите внимание, что все вышеперечисленное дает нам то же, что и [list(z) for z in zip(arr, arr)]. И если мы просто выравниваем zip, нам не нужно преобразовывать его в список списков вместо итератора кортежей, просто используйте его как есть:

dubs = zip(arr, arr)
dubs = [x for l in dubs for x in l]

… который вы можете снова упростить:

[x for l in zip(arr, arr) for x in l]
0 голосов
/ 28 апреля 2018

Мне кажется, что вы хотите индекс и элемент, а не элемент дважды. В этом случае вы захотите использовать enumerate(). Второй параметр enumerate() указывает начальный индекс, который будет использоваться при возврате кортежей (индекс, значение). Чтобы начать с 0, пропустите параметр start.

dubs = [(i, v) for i, v in enumerate(arr,1)] 

Это даст список кортежей, которые можно сплющить, как @ abarnert показало

dubs = [x for l in dubs for x in l]
0 голосов
/ 28 апреля 2018

зацикливает один и тот же элемент дважды, после чего получается дубликат

In [6]: [i for i in arr for h in range(2)]
Out[6]: [1, 1, 2, 2, 3, 3, 4, 4]

Простой без понимания списка , если вы отсортировали список

In [7]: sorted(arr*2)
Out[7]: [1, 1, 2, 2, 3, 3, 4, 4]
...