使用单个值压缩多个值

时间:2014-07-08 20:15:05

标签: python list

我有一个清单:

ave=['Avg']

另一个:

range(0,24)

我如何压缩它们以便:

[0,'Avg',1,'Avg',....23,'Avg']

最好不要在括号中加上每个条目,即

[[0,'Avg'],[...]]

因为我后来想把这个列表变成CSV。

我知道我可以通过一个简单的循环来实现它,但是有更简洁的方法吗?一个功能可能吗?

6 个答案:

答案 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_iterableitertools.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))