2017-06-05 118 views
-2

说我有诸如获取生成一个列表:如何根据变量自定义列表分组?

list_x = [0,1,2,3,4,5,6,7,8,9] 

然后我把它像这样:

list_x = [01,23,45,67,89] 

与此列表理解:

list_x = [0,1,2,3,4,5,6,7,8,9] 
grp_count = 2 
new_list = map(int, [list_x[i+0]+list_x[i+1] for i in range(0, len(list_x)-1, grp_count)]) 

哪有我使这个代码,所以我可以将它分组为基于`grp_count'

例如,如果group_count = 5

list_x = [,56789] 

我知道我必须插入多个list_x[i+n]每次添加的分组大小的莫名其妙。

+0

你的代码提供'1,5,9,13,17'。那是你需要的吗? – Psidom

+0

默认情况下,Python不显示整数的前导零。 – martineau

+1

什么应该是列表中的returnformat:strings(python中的字符列表)? O元组? – inetphantom

回答

0

您可以使用list comprehension做这样的例子的伎俩:

def grouper(a, num): 
    if num > int(len(a)/2): 
     return [] 
    # If you need to return only a list of lists use: 
    # return [a[k:k+num] for k in range(0, len(a), num)] 
    return ["".join(map(str, a[k:k+num])) for k in range(0, len(a), num)] 

a = [0,1,2,3,4,5,6,7,8,9] 
print(grouper(a, 2)) 
print(grouper(a, 5)) 

输出:

['01', '23', '45', '67', '89'] 
['', '56789'] 
+0

返回的行非常易读,总体易懂...不是 – inetphantom

+0

现在用'map()'?这是一个简单的'list comprehension' ... –

+0

不客气。格莱德这个答案正在帮助你。快乐的编码。 –

1

这看起来很像迭代工具石斑鱼食谱从https://docs.python.org/3/library/itertools.html

from itertools import zip_longest 

def grouper(iterable, n, fillvalue=None): 
    "Collect data into fixed-length chunks or blocks" 
    # grouper('ABCDEFG', 3, 'x') --> ABC DEF Gxx" 
    args = [iter(iterable)] * n 
    return zip_longest(*args, fillvalue=fillvalue) 

然后

list_x = [0,1,2,3,4,5,6,7,8,9] 
print(list(grouper(list_x, 5, 0))) 

[(0, 1, 2, 3, 4), (5, 6, 7, 8, 9)] 
1

正如我在评论说,没有办法建立在Python整数列表会显示类似[,56789]因为Python没有用领​​秀整数的价值那样的零。你可以得到最接近的是[1234, 56789]

但是您可以创建与他们这些数字像这样的列表:

def grouper(n, iterable): 
    return zip(*[iter(iterable)]*n) 

list_x = [0,1,2,3,4,5,6,7,8,9] 
grp_count = 5 
new_list = [''.join(map(str, g)) for g in grouper(grp_count, list_x)] 
print(new_list) #-> ['', '56789'] 
+0

你能解释为什么在'zip()'里面使用'* [iter(iterable)] * n'?我没有理解背后的原因。谢谢。 –

+1

@Chiheb:为什么?因为,用作'zip()'的参数,所以这是一种紧凑的方式来创建一个迭代器,该迭代器将从'n'项目组的第二个参数中返回元素。那是你想知道的吗?如果写成'*([iter(iterable)] * n)',可能会更容易理解。 – martineau

+1

感谢您的评论。这是我第一次看到像你这样的一段代码。而且我认为即使在你评论之后,我的表现也不尽如人意。我会试着冥想你的答案,并尝试理解你用来解决当前问题的方式。非常感谢您的评论。祝你今天愉快。 –

相关问题