2013-12-06 4 views
4

Чтобы сделать мою программу более красивой, а не уродливой, я пытаюсь найти более питоновский способ добавления одного значения несколько раз в список. Я теперь использую цикл, но я создаю переменную, которую я не использую.Добавляйте одно и то же значение несколько раз к списку

l = []; n = 5; v = 0.5 

for i in xrange(n): 
    l.append(v) 

Любые идеи?

+2

'l = [0.5] * 5' – falsetru

+0

Это определит l, а не прилагается к нему. Если l уже имеет значения, они будут потеряны. – Boo

+0

Спасибо, Lattyware за самый общий ответ, хотя я буду использовать решение Boo в этом конкретном случае;) – Bsje

ответ

13

Для добавления V, п раз, к л:

l += n * [v] 
+0

Nice и короткие. –

6

Попробуйте использовать list.extend и умножения оператора для списков

l.extend([v] * n) 
+2

Обратите внимание, что это приведет к созданию списка '[v, v, v ...]' 'n' раз, что отлично, если значение неизменно, но может привести к неожиданному поведению, если значение изменено и вы ожидаете, что оно будет независимым. –

+1

Обратите внимание, что если 'v' является изменяемым объектом, это может привести к нежелательным результатам. –

+0

В случае * вы знаете, что 'v' изменен *, вы должны использовать' [v.copy()] * n'. –

8

Самый общий ответ к этому следует использовать list.extend() и a generator expression:

l.extend(generate_value() for _ in range(n)) 

Это добавит значения n раз. Обратите внимание, что это будет оценивать generate_value() каждый раз, вопросы побочных пошагового с изменяемыми значениями, другие ответы могут быть:

>>> [[1]] * 5 
[[1], [1], [1], [1], [1]] 
>>> _[0].append(1) 
>>> _ 
[[1, 1], [1, 1], [1, 1], [1, 1], [1, 1]] 
>>> [[1] for _ in range(5)] 
[[1], [1], [1], [1], [1]] 
>>> _[0].append(1) 
>>> _ 
[[1, 1], [1], [1], [1], [1]] 

При использовании метода умножения, вы в конечном итоге со списком русских ссылок на тот же список. Когда вы меняете его, вы видите изменение в каждом элементе списка - поскольку они все одинаковы.

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

Очевидно, что в вашем примере значения неизменяемы, поэтому это не имеет значения - но это стоит помнить для разных случаев, или если значения не могут быть неизменными.

+0

В качестве альтернативы 'generate_value()'; в большинстве случаев вы также можете использовать 'copy.deepcopy()' –

+0

@LieRyan 'В большинстве случаев' сильно - в большинстве случаев вы, вероятно, просто ставите вызов конструктора или литерал там, поэтому копирование не будет необходимо. 'Копия.deepcopy() 'также работает только на вещах, которые реализуют' __deepcopy __() ', что не является гарантией. 'generate_value()' является владельцем места, предназначенным для отображения того, что можно использовать все, что дает значение, включая, но не ограничиваясь, 'copy.deepcopy()'. –

Смежные вопросы