2014-02-18 2 views
-4
a = [1, 2] 
print a * 2 

производит [1, 2, 1, 2]. ТеперьПреобразовать [[1, 2], [3, 4]] в [[1, 2, 1, 2], [3, 4, 3, 4]] без зацикливания

b = [[1, 2], [3, 4]] 

Могу ли я конвертировать b в [[1, 2, 1, 2], [3, 4, 3, 4]] без зацикливания?

+4

Почему без зацикливания? С циклом это так же просто, как это: 'b = [x * 2 для x в a]'. – Linuxios

+0

Почему опускаются вопросы по этому вопросу? Возможно, это относится к codegolf, но в остальном я не уверен, что с ним не так. – wflynny

+1

@Bill, пока не появится объяснение, почему цикл не разрешен, это ужасно бесполезный гандикап – mhlester

ответ

4

Учитывается ли список как цикл?

>>> [x*2 for x in b] 
[[1, 2, 1, 2], [3, 4, 3, 4]] 
+1

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

0

Как говорили другие, итерация произойдет независимо от того, хотите ли вы решить проблему для произвольного количества списков. Если список содержит только 2 членов, следующее решение работает без итерации:

b = [[1, 2], [3, 4]] 
# Uses iterable unpacking, which may be considered iteration 
l1, l2 = b 
# If you don't want iterable unpacking, use that instead: 
# l1 = b[0]; l2 = b[1] 
print [l1 * 2, l2 * 2] 

Для произвольного числа списков и «скрытая» итерация (вы перебор с функцией map, а не с явным for циклом) , попробуйте следующее:

b = [[1, 2], [3, 4]] 
print map(lambda x: x * 2, b) 
+0

'map (lambda' ... ouch – mhlester

+2

@mhlester Ну, это ужасный вкус, но OP * спросил * без итерации. Конечно, я тоже использовал бы понимание списка или цикл' for' в реальном мире;) –

3

Если вы не можете использовать циклы, не стесняйтесь использовать рекурсию:

def expand(mylist,n): 
    if len(mylist)==1: 
     return [mylist[0]*n] 
    else: 
     return [mylist[0]*n] + expand(mylist[1:],n) 

Вход:

a = [[1,2],[3,4],[5,6]] 

вызовов:

expand(a,2) 

Выходные:

[[1, 2, 1, 2], [3, 4, 3, 4], [5, 6, 5, 6]] 
8

Если вы не возражаете список кортежей, вы можете попробовать некоторые zip махинации:

zip(*zip(*b)*2) 

который возвращается

[(1, 2, 1, 2), (3, 4, 3, 4)] 
+2

, что является довольно хорошим значком. ** + 1 ** – mhlester

0

Вы можете использовать map:

>>> b = [[1, 2], [3, 4]] 
>>> list(map(lambda l: l*2, b)) 
[[1, 2, 1, 2], [3, 4, 3, 4]] 
+0

Это то же самое, что и понимание списков, гораздо менее читаемое. –

+2

Это своего рода суровый. OP сказал, что «нет циклов», и читаемость находится в поле зрения наблюдателя. – dawg

+5

Ну, теперь я слишком напуган, чтобы опубликовать «список (карта (список, карта (chain.from_iterable, map (partial (repeat, times = 2), b))))', хотя это интересно, если люди идут чтобы опросить ответы, которые, возможно, удовлетворяют (откровенно глупым) требованиям. [+1.] – DSM

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