在列表中以特定间隔添加项目(Python)

时间:2014-02-21 04:04:07

标签: python list

基本上我的问题是:

我有一个包含整数的列表。在这种情况下,整数反映各个像素的灰度值。我已经建立了一个变量(xpixel),它是照片的宽度(以像素为单位)。当我的列表命中这个数字时(就在xpixel-1像素整数之后),我需要添加一个特殊的识别字符来表示像素线已经完成并开始下一行。这将以xpixel到整个整数字符串的间隔继续。

那么,我如何在给定的时间间隔内将一个项目添加到我的列表中呢?

这样的东西?:

j=0
for i in Pixels:
    if j%xpixel==0 and j!=0:
        pixel_corrected.append(i)
        pixel_corrected.append('END PIXEL LINE')
        j+=1
    else:
        pixel_corrected.append(i)
        j+=1

提前感谢您的帮助。

5 个答案:

答案 0 :(得分:2)

这样的东西?

>>> from itertools import chain
>>> xpixel = 5
>>> Pixels = range(12)
>>> list(chain.from_iterable([[item, 'END PIXEL LINE'] 
                 if j%xpixel==0 and j else [item] for j, item in enumerate(Pixels)]))
[0, 1, 2, 3, 4, 5, 'END PIXEL LINE', 6, 7, 8, 9, 10, 'END PIXEL LINE', 11]

答案 1 :(得分:0)

嗯,你的方法看起来很合理,我们可以把它变成python-y虽然

for n, x in enumerate(Pixels):
    if n > 0 and n % xpixe == 0:
        # append your marker
    # append x

或者,您可以使用此question的答案并生成列表列表。

答案 2 :(得分:0)

通过列表理解:

data = [1,2,3,4,5,6,7,8,9,10,11,12]
xpixel = 4
[x for l in [data[i:i+xpixel] + ['endl'] for i in range(len(data)/xpixel)] for x in l]

将产生

[1,2,3,4,'endl',5,6,7,8,'endl',9,10,11,12,'endl']

答案 3 :(得分:0)

如sashkello所述,您可以考虑使用列表对照片进行编码。尝试列表理解:

>>> pixels = list(range(20))
>>> xpixel = 5
>>> [pixels[x:x+xpixel] for x in range(0, len(pixels), xpixel)]
[[0, 1, 2, 3, 4], [5, 6, 7, 8, 9], [10, 11, 12, 13, 14], [15, 16, 17, 18, 19]]

答案 4 :(得分:0)

这听起来像是一个黑客,你真的需要一个包含一个列表的简单对象,该列表提供了一个自定义输出方法write_lines(linelength=...),这是一个完美的用于itertools配方。

这样我们就不会弄乱底层列表,因此您仍然可以将其作为列表进行处理。

import itertools

class PixelList(object):
    def __init__(self, lst, xpixel=None): # you could also parameterize fillvalue='END PIXEL LINE'
        self.lst = lst
        self.xpixel = xpixel
    def set_xpixel(self, xpixel):
        self.xpixel = xpixel
    #wrapperize whatever other methods of list you need to pass through
    #...
    def writelines(self, fillvalue='END PIXEL LINE'):
        # using itertools 'grouper' recipe: "grouper(3, 'ABCDEFG', 'x') --> ABC DEF Gxx"
        args = [iter(self.lst)] * self.xpixel
        print [a for a in args]
        return itertools.izip_longest(fillvalue=fillvalue, *args)

l = PixelList(range(1,54), 10)