Itertools将阵列分成子阵列

时间:2017-09-13 09:42:00

标签: 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']]

我该怎么做呢?我的想法是在itertools中使用groupby 得到类似

的东西
['a', 'b', ['c.1', 'c.2', 'c.3'], ['d.1', 'd.2', 'd.3', '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)

我该怎么做?

4 个答案:

答案 0 :(得分:3)

你不需要itertools。

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

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']]

答案 1 :(得分:1)

最简单的方法:

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']]

答案 2 :(得分:1)

以下是一般方法的互动演示。 首先定义输入列表:

>>> 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']

计算前缀的乘积与其余元素:

>>> 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']]

答案 3 :(得分:0)

像这样使用list comprehension

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']]