2016-10-01 62 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')]