2017-07-10 76 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

相关问题