Jak podwoić każdy element na liście bez użycia jakiegokolwiek importu?

Jakiś przykład:

>>> 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']

Właśnie wchodzę, ale łączy elementy razem raczej w oddzielnym ciągiem.

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

Wyjścia Dostaję:

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

Dziękuję dla tych, którzy pomogą :)

3
Sc4r 23 listopad 2013, 01:54

6 odpowiedzi

Najlepsza odpowiedź

Tak blisko ... naiwny podejście:

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

Twój problem był spowodowany faktem, że struny są również listami 'a' * 2 nie jest ['a', 'a'], ale aa. Teraz, znając problem, nadal można go rozwiązać w jednej pętli, przenosząc item wewnątrz listy singleton: lepiej podejście:

for item in sample_list:
    new_list.extend([item] * 2)
1
Mihai Maruseac 22 listopad 2013, 22:04

Jeśli przeglądasz go, gdy spłaszczysz listę, w której każdy element tej listy jest elementy powtarzane n razy możesz napisać go jako zagnieżdżoną listę:

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

Zwykły zastrzeżenie stosuje się, że elementy "mnożone" będą ten sam obiekt ... więc bądź ostrożny z elementów zawierających znamialne przedmioty.

2
Jon Clements 22 listopad 2013, 22:05

1

>>> 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]

Aby przekształcić go w funkcję:

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

A następnie uogólniać:

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

1 Zawsze należy unikać zagnieżdżonych premii, ponieważ nigdy nie pamiętam kolejności tych rzeczy ...

0
mgilson 22 listopad 2013, 22:07
multiply_items = lambda lst: [item for item in lst for i in range(2)]
0
Hugh Bothwell 22 listopad 2013, 22:52

Oto sposób, w jaki możesz korzystać z wbudowanej funkcji {X0}}.

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

print multiply_list(['a', 'b'], 2)
0
kyle k 23 listopad 2013, 01:06

Często wolę kompymsionów listy:

def multiply_items(l):
    return [i for t in zip(l,l) for i in t]
4
Robᵩ 22 listopad 2013, 22:02