如何获取元组列表中的元素

时间:2018-06-20 07:42:11

标签: python

我有一组节点

nodes = ["uno","dos","tres","cuatro","cinco","seis"]

和一组边缘

edges = [("uno", "dos"),
     ("uno", "tres"), 
     ("dos", "tres"), 
     ("dos", "cuatro"), 
     ("tres", "cuatro"), 
     ("tres", "cinco"), 
     ("cuatro", "cinco"), 
     ("cuatro", "seis"), 
     ("cinco", "seis")]

我已经定义了这些边的倒数

inverses =[(j,i) for (i,j) in edges]

现在我有了一组弧线

arcs = edges + inverses

我的问题是,我想获得一组确定的第一个元素的弧集中的所有元素。那是

ArcsOut[i in nodes] = [(i,j) for (i,j) in arcs for i in nodes for j in nodes].

我想获得类似的东西。如果我要获得所有具有拳头成分“ uno”的弧,我希望拥有:

ArcsOut["uno"]= [("uno", "dos"),("uno", "tres"),("dos", "uno"),("tres", "uno")] 

但是我不知道该如何订购。 预先感谢!

2 个答案:

答案 0 :(得分:2)

使用以下语法创建字典:

ArcsOut = dict(((i,[(k,l) for k,l in arcs if k == i]) for (i,j) in arcs))

然后ArcsOut ['unos'] =所需的输出。

/ *编辑* /

明智地考虑使用defaultdict

ArcsOut = defaultdict(list)
for k, v in arcs:
    ArcsOut[k].append((k,v)) 

答案 1 :(得分:1)

您可以通过列表理解来做到这一点。令人高兴的是,您可以将元组解包与条件一起使用,以使其变得非常简短,并使其清晰易读。

arc_out = {node: [(i, j) for i, j in arcs if i == node] for node in nodes]

相反,如果要获得 ij与特定节点名称匹配的所有边缘,则可以这样做

[edge for edge in arcs if 'uno' in edge]