2017-09-13 34 views
2

我有一个字符串数组,看起来像这样Itertools打破一个数组子阵

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

我如何去这样做?我的想法是使用GROUPBY在itertools 要达到这样的

['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) 

我该怎么做?

+0

什么是'c .1'?这是无效的语法 – RomanPerekhrest

+0

'c.1'不是一个正确的Python语法。它应该是一个字符串?逻辑是什么?为什么要对'a'和'b'进行区别对待? –

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

非常感谢!今天学了点儿新东西 – Ajit

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