Python Itertools可将阵列分解为子阵列

Python Itertools可将阵列分解为子阵列,python,Python,我有一个字符串数组,看起来像这样 ['a', 'b', 'c.1', 'c.2', 'c.3', 'c.4', 'd.1', 'd.2', 'd.3'] 我想把它分解成 [['a', 'b', 'c.1'], ['a', 'b', 'c.2'], ['a', 'b', 'c.3'], ['a', 'b', 'd.1'], ['a', 'b', 'd.2'], ['a', 'b', 'd.3'], ['a', 'b', 'd.4']] result = [] for elem in nes

我有一个字符串数组,看起来像这样

['a', 'b', 'c.1', 'c.2', 'c.3', 'c.4', 'd.1', 'd.2', 'd.3']
我想把它分解成

[['a', 'b', 'c.1'], ['a', 'b', 'c.2'], ['a', 'b', 'c.3'],
 ['a', 'b', 'd.1'], ['a', 'b', 'd.2'], ['a', 'b', 'd.3'],
 ['a', 'b', 'd.4']]
result = []
for elem in nestedList:
    if isinstance(elem, list):
        temp = []
        for elem in nestedList:
            if not isinstance(elem, list):
                temp.append(elem):
        temp.append(elem)
    result.append(temp)
我该怎么做呢?我的想法是在itertools中使用groupby 得到

['a', 'b', ['c.1', 'c.2', 'c.3'], ['d.1', 'd.2', 'd.3', 'd.4']]
然后可能是

[['a', 'b', 'c.1'], ['a', 'b', 'c.2'], ['a', 'b', 'c.3'],
 ['a', 'b', 'd.1'], ['a', 'b', 'd.2'], ['a', 'b', 'd.3'],
 ['a', 'b', 'd.4']]
result = []
for elem in nestedList:
    if isinstance(elem, list):
        temp = []
        for elem in nestedList:
            if not isinstance(elem, list):
                temp.append(elem):
        temp.append(elem)
    result.append(temp)
为此,我需要访问groupby中的下一个元素

(Something like lambda x: '.' not in x and nextelement.split('.')[0] != x)
我如何做到这一点?

使用如下方法:

my_list = ['a', 'b', 'c.1', 'c.2', 'c.3', 'c.4', 'd.1', 'd.2', 'd.3']
res = [[my_list[0], my_list[1], item] for item in my_list[2:]]
输出:

>>> from pprint import pprint
>>>
>>> pprint(res)
[['a', 'b', 'c.1'],
 ['a', 'b', 'c.2'],
 ['a', 'b', 'c.3'],
 ['a', 'b', 'c.4'],
 ['a', 'b', 'd.1'],
 ['a', 'b', 'd.2'],
 ['a', 'b', 'd.3']]
最简单的方法:

l = ['a', 'b', 'c.1', 'c.2', 'c.3', 'c.4', 'd.1', 'd.2', 'd.3']
result = [l[:2] + [i] for i in l[2:]]
print(result)
输出:

[['a', 'b', 'c.1'], ['a', 'b', 'c.2'], ['a', 'b', 'c.3'], ['a', 'b', 'c.4'], ['a', 'b', 'd.1'], ['a', 'b', 'd.2'], ['a', 'b', 'd.3']]

你不需要工具

您可以简单地使用列表理解来过滤带有或不带有
“.
的字符串,并在另一个列表理解中再次组合它们:

data = ['a', 'b', 'c.1', 'c.2', 'c.3', 'c.4', 'd.1', 'd.2', 'd.3']

lone_letters = [x for x in data if '.' not in x]
combined_letters = [x for x in data if '.' in x]

print([lone_letters + [x] for x in combined_letters])
# [['a', 'b', 'c.1'], ['a', 'b', 'c.2'], ['a', 'b', 'c.3'], ['a', 'b', 'c.4'], ['a', 'b', 'd.1'], ['a', 'b', 'd.2'], ['a', 'b', 'd.3']]

下面是一个通用方法的交互式演示。 首先定义输入列表:

>>> l = ["a", "b", "c.1", "c.2", "c.3", "c.4", "d.1", "d.2", "d.3"]
>>> l
['a', 'b', 'c.1', 'c.2', 'c.3', 'c.4', 'd.1', 'd.2', 'd.3']
收集常用前缀元素:

>>> p = [e for e in l if "." not in e]
>>> p
['a', 'b']
>>> r = [e for e in l if e not in p]
>>> r
['c.1', 'c.2', 'c.3', 'c.4', 'd.1', 'd.2', 'd.3']
计算其余元素:

>>> p = [e for e in l if "." not in e]
>>> p
['a', 'b']
>>> r = [e for e in l if e not in p]
>>> r
['c.1', 'c.2', 'c.3', 'c.4', 'd.1', 'd.2', 'd.3']
计算前缀与其余元素的乘积:

>>> from itertools import product
>>> [x[0] + list(x)[1:] for x in product([p],r)]
[['a', 'b', 'c.1'], ['a', 'b', 'c.2'], ['a', 'b', 'c.3'], ['a', 'b', 'c.4'],
 ['a', 'b', 'd.1'], ['a', 'b', 'd.2'], ['a', 'b', 'd.3']]

什么是
c.1
?这是无效语法
c.1
不是正确的Python语法。它应该是一根绳子吗?逻辑是什么?为什么要对
a
b
区别对待?它们应该是字符串吗?是的,它们是字符串