2013-11-22 5 views
3

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

Некоторые Пример:

>>> multiply_items(['a', 'b']) 
['a', 'a', 'b', b'] 
>>> multiply_items(['b', 'a']) 
['b', 'b', 'a', a'] 
>>> multiply_items(['a', 'b', 'c']) 
['a', 'a', 'b', b', 'c', c'] 
>>> multiply_items(['3', '4']) 
['3', '3', '4', 4'] 
>>> multiply_items(['hi', 'bye']) 
['hi', 'hi', 'bye', bye'] 

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

def multiply_items(sample_list): 
    '''(list) -> list 

    Given a list, returns the a new list where each element in the list is 
    doubled. 

    >>> multiply_items(['a', 'b']) 
    ['a', 'a', 'b', b'] 
    >>> multiply_items(['a', 'b', 'c']) 
    ['a', 'a', 'b', b', 'c', c'] 
    >>> multiply_items(['3', '4']) 
    ['3', '3', '4', 4'] 

    ''' 
    new_list = [] 
    for item in sample_list: 
     new_list.append(item * 2) 
    return new_list 

Выходы я получаю:

>>> multiply_items(['3', '4']) 
['33', '44'] 
>>> multiply_items(['hi', 'bye']) 
['hihi', 'byebye'] 

Спасибо за тех, кто помогает :)

+2

Вот подсказка, вам понадобятся две линии, а не одна строка в вашем цикле for. – AlexLordThorsen

ответ

1

Так близко ... The наивным подход:

for item in sample_list: 
    for i in range(2): 
     new_list.append(item) 

вашу проблему был вызван тем фактом, что строки также являются списками, поэтому 'a' * 2 нет t ['a', 'a'] но aa. Теперь, зная эту проблему, вы можете решить в одном цикле, перемещая item внутри одноплодный список: лучше подхода:

for item in sample_list: 
    new_list.extend([item] * 2) 
+0

Вероятно, это оптимизировано, но действительно ли нужно использовать вложенный цикл? – turbo

+0

Я заполнил ответ более подробными сведениями и что также;) –

+0

Осторожно. Второй фрагмент кода должен быть 'new_list.extend', а не 'new_list.append'. – mgilson

4

Я часто предпочитаю списковые:

def multiply_items(l): 
    return [i for t in zip(l,l) for i in t] 
2

Если вы просматриваете его, когда вы выравниваете список, где каждый элемент этого списка является повторяющимися элементами. n раз, то вы можете записать его как вложенный список-comp:

data = ['a', 'b'] 
doubled = [item for sub in data for item in [sub] * 2] 

Обычное оговорку применяется к тому, что «умноженные» элементы будут того же объекта ... Так что будьте осторожны с элементами, содержащими изменяемые объекты.

+0

Я никогда не могу получить свои вложенные списки в правильном порядке. По какой-то причине этот синтаксис для меня никогда не был чрезвычайно интуитивным. – mgilson

+0

@mgilson, если вам становится лучше - мне не нужно писать их очень часто (я предпочитаю chain.from_iterable) - и должен был подумать об этом, и имел пару неудачных попыток –

0

Вот несколько «умная» версия, которая не включает в себя вложенный список-понимание :

>>> a = range(5) 
>>> a 
[0, 1, 2, 3, 4] 
>>> b = [None] * (2*len(a)) # allocate new list 
>>> b 
[None, None, None, None, None, None, None, None, None, None] 
>>> b[::2] = a 
>>> b 
[0, None, 1, None, 2, None, 3, None, 4, None] 
>>> b[1::2] = a 
>>> b 
[0, 0, 1, 1, 2, 2, 3, 3, 4, 4] 

Чтобы превратить его в функцию:

def multiply_list(lst): 
    out = [None] * (2*len(lst)) 
    out[::2] = lst 
    out[1::2] = lst 
    return out 

А потом обобщить :

def multiply_list(lst, n=2): 
    out = [None] * (n*len(lst)) 
    for i in range(n): 
     out[i::n] = lst 
    return out 

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

0
multiply_items = lambda lst: [item for item in lst for i in range(2)] 
0

Вот способ, которым вы можете с помощью встроенного в list функции.

def multiply_list(data, times): 
    multiplied = [] 
    for item in data: 
     multiplied=multiplied+list(item)*times 
    return multiplied 

print multiply_list(['a', 'b'], 2) 
Смежные вопросы