2015-03-23 3 views
0

Какой самый питонический способ добавить несколько одинаковых значений в список? Конечно, я могу сделать это с помощью петли или какPythonic способ добавить несколько одинаковых значений в список

someList += [someValue for i in range(someNumber)] 

Но может быть, есть лучший способ или функция?

+3

'someList.extend ([3] * 10) 'как только значение будет неизменным –

ответ

4

someValue Если неизменен, вы можете использовать умножение:

someList += [someValue] * someNumber 

Это создает someNumber ссылки на тот же объект someValue. Это означает, что если someValue является объектом mutable, вы увидите изменения этого объекта, отраженные во всех этих ссылках.

Так что для mutable типов вы обычно используете понимание списка, чтобы убедиться, что новый объект создан. Чтобы расширить список, вместо += вы можете также использовать list.extend() с выражением генератора:

someList.extend(['extra', 'list', 'elements'] for _ in range(someNumber)) 

Демо:

>>> someList = ['foo', 'bar', 'baz'] 
>>> someList += ['spam'] * 5 
>>> someList 
['foo', 'bar', 'baz', 'spam', 'spam', 'spam', 'spam', 'spam'] 

и изменяемый объект (список в данном случае):

>>> someList = ['foo', 'bar', 'baz'] 
>>> someList += [['spam']] * 5 
>>> someList 
['foo', 'bar', 'baz', ['spam'], ['spam'], ['spam'], ['spam'], ['spam']] 
>>> someList[-1].append('ham') 
>>> someList 
['foo', 'bar', 'baz', ['spam', 'ham'], ['spam', 'ham'], ['spam', 'ham'], ['spam', 'ham'], ['spam', 'ham']] 
>>> someList[-1] is someList[-2] 
True 
2

попробовать это, если somevalue неизменен

someList += [somevalue] * somenum 
2

Почему бы не использовать мультипликативный оператор *, например, так:

someList += [someValue] * someNumber 

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

Пример:

>>>someList = [5] 
>>>someList += [10] * 10 
>>>someList 
[ 5, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10] 

В качестве альтернативы, если вы не хотите быть ссылки и тот же элемент каждый раз (возможно, изменяемый тип и т.д.), вы всегда можете использовать список понимание, как вы делают для того чтобы создать новые элементы для каждого элемента списка:

someList += [10 for i in range(10)] 
1

вы можете использовать функцию repeat от itertools, чтобы сделать его более понятным читателю, что то, что вы делаете, повторяя Валу е, прежде чем добавить его в список:

import itertools as it 
someList += it.repeat(someValue, someNumber) 

Конечно, я не думаю, что ваш исходный код не читается или unpythonic, чтобы начать с ...

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