我有一个清单:
ave=['Avg']
另一个:
range(0,24)
我如何压缩它们以便:
[0,'Avg',1,'Avg',....23,'Avg']
最好不要在括号中加上每个条目,即
[[0,'Avg'],[...]]
因为我后来想把这个列表变成CSV。
我知道我可以通过一个简单的循环来实现它,但是有更简洁的方法吗?一个功能可能吗?
答案 0 :(得分:4)
如您所述,很容易获得配对,但您可以使用itertools.chain()
打开配对:
from itertools import chain
fields = ['Avg']
indexes = range(0, 24)
groups = [[i] + fields for i in indexes]
flat_list = list(chain.from_iterable(groups))
答案 1 :(得分:4)
我认为像这样的循环足够干净:
ave=['Avg']
lst = []
for x in range(24):
lst.extend((x,ave[0]))
lst
:
>>> lst
[0, 'Avg', 1, 'Avg', 2, 'Avg', 3, 'Avg', 4, 'Avg', 5, 'Avg', 6, 'Avg', 7, 'Avg', 8, 'Avg', 9, 'Avg', 10, 'Avg', 11, 'Avg', 12, 'Avg', 13, 'Avg', 14, 'Avg', 15, 'Avg', 16, 'Avg', 17, 'Avg', 18, 'Avg', 19, 'Avg', 20, 'Avg', 21, 'Avg', 22, 'Avg', 23, 'Avg']
答案 2 :(得分:4)
使用itertools.chain.from_iterable
和itertools.izip_longest
:
>>> from itertools import chain, izip_longest
>>> ave = ['Avg']
>>> r = range(0,24)
>>> list(chain.from_iterable(izip_longest(r, ave, fillvalue=ave[0])))
[0, 'Avg', 1, 'Avg', 2, 'Avg', 3, 'Avg', 4, 'Avg', 5, 'Avg', 6, 'Avg', 7, 'Avg', 8, 'Avg', 9, 'Avg', 10, 'Avg', 11, 'Avg', 12, 'Avg', 13, 'Avg', 14, 'Avg', 15, 'Avg', 16, 'Avg', 17, 'Avg', 18, 'Avg', 19, 'Avg', 20, 'Avg', 21, 'Avg', 22, 'Avg', 23, 'Avg']
>>>
如果不导入,使用list comprehension的效率会稍微低一些,但仍然可行:
>>> ave = ['Avg']
>>> r = range(0,24)
>>> [y for x in r for y in (x, ave[0])]
[0, 'Avg', 1, 'Avg', 2, 'Avg', 3, 'Avg', 4, 'Avg', 5, 'Avg', 6, 'Avg', 7, 'Avg', 8, 'Avg', 9, 'Avg', 10, 'Avg', 11, 'Avg', 12, 'Avg', 13, 'Avg', 14, 'Avg', 15, 'Avg', 16, 'Avg', 17, 'Avg', 18, 'Avg', 19, 'Avg', 20, 'Avg', 21, 'Avg', 22, 'Avg', 23, 'Avg']
>>>
答案 3 :(得分:2)
Generator是一个函数,它不返回单个结果,但在它使用的任何运行期间都可以产生多个结果。
具有如下函数gen
:
def gen(itm, nums):
for num in nums:
yield num
yield itm
>>> g = gen("Avg", range(0, 4))
>>> list(g)
[0, 'Avg', 1, 'Avg', 2, 'Avg', 3, 'Avg']
list
函数强制g
生成器实例迭代所有可用值,直到没有更多项可以生成并将它们返回到列表中。
next()
您也可以使用next
以其他方式使用生成器,逐个获取值:
>>> g = gen("Avg", range(0, 4))
>>> g.next()
0
>>> g.next()
'Avg'
>>> g.next()
1
>>> g.next()
'Avg'
>>> g.next()
2
>>> g.next()
'Avg'
>>> g.next()
3
>>> g.next()
'Avg'
>>> g.next()
---------------------------------------------------------------------------
StopIteration Traceback (most recent call last)
<ipython-input-17-d7e53364a9a7> in <module>()
----> 1 g.next()
StopIteration:
请注意,当没有更多值可以产生时,我们会收到StopIteration
异常。
另一个重要细节是,生成器具有内部状态,您必须初始化它以从第一个到最后一个再次获取值。耗尽的生成器实例不会再产生任何值。
答案 4 :(得分:1)
另一个选择
ave = ['Ave']
m = range(24)
[a for b in [(x, ave[0]) for x in m] for a in b]
[0, 'Ave', 1, 'Ave', 2, 'Ave', 3, 'Ave', 4, 'Ave', 5, 'Ave', 6, 'Ave', 7, 'Ave', 8, 'Ave', 9, '
答案 5 :(得分:1)
这是一个有趣的解决方案:
from operator import add
reduce(add, zip(range(0, 24), ['Avg']*24))