合并元组中的元素?

时间:2016-10-01 17:19:17

标签: python tuples

这里有一个数据集:

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模块可以解决这个问题,但是想要编写一个函数来将数据传输到元组而不导入任何模块。我回顾了论坛上发布的一些过去的问题,但我仍然对这样做感到困惑。

4 个答案:

答案 0 :(得分: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))

答案 1 :(得分: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')]

答案 2 :(得分:0)

您明智地建议使用的itertools函数文档中的“大致相当于”代码显示了实际用Python编写的正确版本:

https://docs.python.org/3/library/itertools.html#itertools.combinations

答案 3 :(得分: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

这有效,但是以不同的顺序发出。如果你关心这一点,你必须从节点列表的末尾开始并构建它。