如何让列表自动分割我的想法?

时间:2017-06-14 17:38:24

标签: python list

我在这里有一些代码:

lsp_rows = ['a', 'b', 'c', 'd', 'e', 'b', 'c', 'd', 'e', 'a', 'c', 
            'd', 'e', 'a', 'b', 'd', 'e', 'a', 'b', 'c', 'e', 'a', 
            'b', 'c', 'd']
n = int(width/length)
x = [a+b+c+d+e for a,b,c,d,e in zip(*[iter(lsp_rows)]*n)]

目前,这将把我的列表“lsp_rows”分为5组,作为我的n = 5。但我需要根据“n”进行不同的分割,因为它会根据宽度和长度的值而改变。 因此,如果n为4,我需要将列表拆分为4。

我可以看到问题出在"a+b+c+d+e for a,b,c,d,e"上,如果没有我的手动输入,我不知道如何进行此更改,有没有办法让我解决这个问题。

如果你们能够尽可能彻底地解释我会非常感激,因为我对python很新。提前致谢!

2 个答案:

答案 0 :(得分:2)

我相信这会将你的表达概括为n项:

import functools
import operator
[functools.reduce(operator.add,abc) for abc in zip(*[iter(x)]*n)]

虽然我还想看一个测试用例。

例如,如果x是列表列表,则结果是x展平的列表。

数字列表或字符串看起来更好:

In [394]: [functools.reduce(operator.add,abc) for abc in zip(*[iter('abcdefghij')]*4)]
Out[394]: ['abcd', 'efgh']
In [395]: [functools.reduce(operator.add,abc) for abc in zip(*[iter('abcdefghij')]*5)]
Out[395]: ['abcde', 'fghij']
In [396]: [functools.reduce(operator.add,abc) for abc in zip(*[iter(range(20))]*5)]
Out[396]: [10, 35, 60, 85]

包含您的角色列表

In [400]: [functools.reduce(operator.add,abc) for abc in zip(*[iter(lsp_rows)]*5)]
Out[400]: ['abcde', 'bcdea', 'cdeab', 'deabc', 'eabcd']
In [401]: [functools.reduce(operator.add,abc) for abc in zip(*[iter(lsp_rows)]*6)]
Out[401]: ['abcdeb', 'cdeacd', 'eabdea', 'bceabc']

如果项目是字符串,则所有这些导入都可以替换为join

答案 1 :(得分:2)

只有字符串才能:

<script src="fontawesome.js"></script> 

或稍微简洁一点,可能更少的内存使用:

[''.join(t) for t in zip(*[iter(lsp_rows)]*n)]

@hpaulj提供的答案在一般情况下更有用。

而且,如果您只是尝试生成字符串的循环,那么以下内容将产生相同的输出。

map(''.join, zip(*[iter(lsp_rows)]*n))