Python列表理解和变量创建

时间:2016-06-26 10:29:14

标签: python python-3.x list-comprehension

我正在尝试创建一个变量'listy',它存储给定范围内数字6,9和20的所有可能组合。

我开始使用大于5的所有数字并且可以被3整除,然后在此列表中添加了一个包含第一个列表+20的每个元素的新列表,并再次重复该过程。

我想只使用一行代码和列表理解来创建列表。是否可能,如果可能,怎么样?

listy =[x for x in range(6,100) if x % 3 == 0]
listy = listy + [x+20 for x in listy] + [x+40 for x in listy]

这打印出所有数字,我可以轻松排序,但我想要一个更优雅的解决方案。

2 个答案:

答案 0 :(得分:0)

您可以尝试:

>>> [i for j in map(lambda x: (x, x+20, x+40), [x for x in range(6,100) if x % 3 == 0]) for i in j]

[6, 26, 46, 9, 29, 49, 12, 32, 52, 15, 35, 55, 18, 38, 58, 21, 41, 61, 24, 44, 64, 27, 47, 67, 30, 50, 70, 33, 53, 73, 36, 56, 76, 39, 59, 79, 42, 62, 82, 45, 65, 85, 48, 68, 88, 51, 71, 91, 54, 74, 94, 57, 77, 97, 60, 80, 100, 63, 83, 103, 66, 86, 106, 69, 89, 109, 72, 92, 112, 75, 95, 115, 78, 98, 118, 81, 101, 121, 84, 104, 124, 87, 107, 127, 90, 110, 130, 93, 113, 133, 96, 116, 136, 99, 119, 139]

答案 1 :(得分:0)

您可以注意到,任何大于43的数字都可以用3,5和20的组合来表示(这不是很难证明)。 只有不超过43的需要20的数字是26,29,32,35,38,41。 所以基本上你可以硬编码所有合适的值:

listy = [x in [6, 9, 12, 15, 18, 21, 24, 26, 27, 29, 30, 32, 33, 35, 36, 38, 39, 41, 42] if x < MAX] # or any 43 < number < MAX
listy = [x for x in range(6, MAX) if x % 3 == 0] + [x in [26, 29, 32, 35, 38, 41] if x < MAX]] # other way

列表推导也是可能的解决方案:

listy =[x for x in range(6,MAX) if x % 3 == 0 or (x>=26 and (x-20)%3 == 0)]