如何使列表自动按所需方式拆分?

2024-05-29 04:16:11 发布

您现在位置:Python中文网/ 问答频道 /正文

我这里有一些代码:

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\u行”分成5组,作为我的n = 5。但是我需要它根据“n”进行不同的拆分,因为它将根据宽度和长度的值进行更改。 所以如果n是4,我需要把列表分成4

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

如果你们能解释得尽可能透彻的话,我会非常感激的,因为我对python还很陌生。提前谢谢!你知道吗


Tags: 代码in列表for宽度情况手动zip
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。你知道吗

只有使用字符串才能:

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

或者更简洁,可能更少的内存使用:

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

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

而且,如果您只是尝试生成字符串的周期,那么下面的代码将生成相同的输出。你知道吗

s = 'abcde'
[s[i:] + s[:i] for i in range(len(s))]

相关问题 更多 >

    热门问题