2017-09-13 39 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']]