Если вы хотите изменить существующий код, чтобы он работал, сначала создайте вложенный список, а затем сгладьте его:
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]