2016-10-01 123 views
2

在這裏,我有一個數據集:合併元組中的元素?

rd=''' 
1:A,B,C;D,E 
2:F,G 
3:H,J,K 
''' 

期望的結果:

[('A','B'),('B',C'),('A','C'),('D','E'),('F','G'),('H','J'),('J','K'),('H','K')] 

我的代碼:

def rd_edges(f): 
    allEdges =[] 
    for line in f.split(): 
     edges =line.split(":")[1].split(';') 
     for edge in edges: 
      i =0 
      j =1 
      for i in len(edge): 
       for j in len(edge): 
        i <j 
        j +=1 
        if j >len(edge): 
         end 
       i +=1 
       if i >len(edge)-1: 
        end 
      allEdges.append(edge(i),edge(j))  

    return allEdges 

我知道itertools模塊可以解決這個問題,但要編寫一個函數將數據傳輸到一個元組中,而不需要導入任何模塊。我回顧了論壇上發佈的一些過去的問題,但我仍然對這樣做感到困惑。

+1

'end'?你的意思是'返回' – JulienD

+0

@idjaw它不是相同的預期輸出。 – JulienD

+0

是的。我也可以看到...所有的問題都很相似。但是這仍然缺乏更多的信息讓OP更清楚地知道他們的代碼失敗。 – idjaw

回答

2

這裏是你如何能做到這一點,而不itertools進口:

def rd_edges(f): 
    allEdges =[] 
    for line in f.split(): 
     edges = line.split(":")[1].split(';') 
     for edge in edges: 
      nodes = edge.split(',') 
      for i, a in enumerate(nodes): 
       for b in nodes[i+1:]: 
        allEdges.append((a,b)) 
    return allEdges 

rd=''' 
1:A,B,C;D,E 
2:F,G 
3:H,J,K 
''' 
print (rd_edges(rd)) 
0
def find_edges(f):  
    out = [] 
    for line in f.split(): 
     line = line.split(':')[1] 
     disjoint = line.split(';') 
     for d in disjoint: 
     s = d.split(',') 
     for i, node in enumerate(s)): 
      for downnode in s[i+1:]: 
      out.append((node, downnode)) 
    return out 

該作品,但以不同的順序發佈。如果你在意這一點,你必須從節點列表的末尾開始,並向它構建。

1

下面是一個簡化的解決方案使用re.compile()itertools.combinations()功能來實現它。爲了拉平列表中,我使用operator.add()reduce()功能:

import re 
from itertools import combinations 
from operator import add 
rd=''' 
1:A,B,C;D,E 
2:F,G 
3:H,J,K 
''' 
my_aplhalist = (re.compile('(\n\d:)').split(rd.rstrip()))[2::2] 
my_combinations = [list(combinations(item.split(','), 2)) for item_str in my_aplhalist for item in item_str.split(';')] 
my_solution = reduce(add, my_combinations) 
# Value of 'my_solution': [('A', 'B'), ('A', 'C'), ('B', 'C'), ('D', 'E'), ('F', 'G'), ('H', 'J'), ('H', 'K'), ('J', 'K')]