2017-07-10 46 views
-1

我有兩個列表如下:列表理解 - 使用的每個元素兩次

first = [1, 2, 3] # integers 
second = ["A", "B"] 

我想產生下面的列表,以交替A和B.注意,所產生的迭代比輸入iterables長:

["1A", "1B", "2A", "2B", "3A", "3B"] 

我目前使用itertools

[str(x1) + x2 for x1, x2 in itertools.product(first, second)] 

但這是「N冰「的方式?有沒有不需要導入的解決方案?

+6

'itertools .product'是一個本地工具 – RomanPerekhrest

+2

'itertools.product'是一個本地函數。如果你認爲內置的答案只是一個嵌套的循環,但沒有針對該任務的特定功能。 – Kasramvd

+2

你爲什麼認爲'itertools'不是一個「原生」解決方案? – DeepSpace

回答

5

你可以嘗試

>>> first = [1, 2, 3] 
>>> second = ['A', 'B'] 
>>> ["{}{}".format(f, s) for s in second for f in first] 
['1A', '2A', '3A', '1B', '2B', '3B'] 
+2

爲了可擴展性,我會使用'itertools.product':print([「{} {}」)格式(f,s)第二個)])' – DeepSpace

+1

@DeepSpace但問題是,如果我找對了,找一個'itertools.product'的替代品。 –

+0

按照與問題中給出的順序相同的順序進行小改動:'[「{} {}」。格式(f,s)for f in first for s in second]' – LangeHaare

1

關於替代itertools.product,檢查Arount's answer

現在關於字符串格式化,使用str(x) + y並不是很Pythonic(而且根本不可縮放)。 相反,使用format字符串的方法,甚至更好,Python的3.6的f-strings

>>> "{}{}".format(x, y) 
>>> "{firstValue}{secondValue}".format(firstValue=x, secondValue=y) 
>>> f"{x}{y}" 

這裏是對string formatting documentation的鏈接。

2

的最好方法是使用嵌套的循環或使用itertools.product(),但如果你想有一個功能性的方法,你可以使用itertools.starmapoperator.add和一些內置的功能,如map()list()如下:

>>> from itertools import product, starmap 
>>> from operator import add 
>>> 
>>> list(starmap(add, product(map(str, first), second))) 
['1A', '1B', '2A', '2B', '3A', '3B'] 
+0

「有沒有不需要導入的解決方案?」 (任意我知道) - 您的解決方案是使用多個導入? –

+0

@Chris_Rands我錯過了編輯,起初如果是本機解決方案。但爲了教育目的,我仍然會保留它;) – Kasramvd

相關問題