列出共享值的元组列表中的所有项目

时间:2017-03-09 01:31:07

标签: python

我有一个元组列表:

l = [(x,y,2),(x,y,3),(x,y,4),(x,y,2),(x,y,2),(x,y,3)]

我需要将共享最后一个值的元组提取到元组列表列表中:

nl = [[(x,y,2),(x,y,2),(x,y,2)],[(x,y,3),(x,y,3)]]

我当然不知道最后的价值。

3 个答案:

答案 0 :(得分:3)

带模块的

使用来自itertools的groupby,您可以通过首先使用相同的lambda进行排序然后分组来对lambda进行分组。使用列表推导,然后将所有分组组合在一起并过滤掉长度为1的所有内容,以消除不共享值的元组。

from itertools import groupby

tuples = [(1, 2, 2), (3, 1, 3), (1, 2, 4), (8, 9, 2), (12, 1, 2), (0, 1, 3)]

tuple_tail = lambda (first, mid, last): last

tuples.sort(key=tuple_tail)

print filter(lambda item: len(item) > 1, [list(group) for key, group in groupby(tuples, tuple_tail)])

没有模块

所以这个不是最好的解决方案,但它是一个解决方案。我定义了一些辅助函数

  1. retrieves last of tuple
  2. compares equality of two tuples
  3. 然后编写了一个自定义组函数,该函数使用filter然后map搜索所有相等的元素,以获取包含所有可能分组的列表(组全部) 。我无法想到一种使用列表理解而不会弄乱的方法所以我选择了reduce并编写了一个函数来删除重复的元素和/或1 的长度(fn) 。如果您使用set或者通常只使用不同的方法,这肯定会得到优化。希望这可以帮助您找到方法将会是什么。

    tuples = [(1, 2, 2), (3, 1, 3), (1, 2, 4), (8, 9, 2), (12, 1, 2), (0, 1, 3)]
    # helper functions
    tuple_tail = lambda (first, mid, last): last
    is_tuples_equal = lambda tuple1, tuple2: tuple_tail(
        tuple1) == tuple_tail(tuple2)
    
    # groups by last (_,_,last)
    group_by_last = lambda tuple: filter(
        lambda item: is_tuples_equal(item, tuple), tuples)
    
    # get all groupings
    group_all = map(group_by_last, tuples)
    
    # if group is not in list and not length of 1 insert into list
    fn = lambda acc, val: acc if val in acc or len(val) == 1 else acc + [val]
    
    print reduce(fn, group_all, [])
    

    with list comprehension

    如果您创建字典并使用每个元组的tuple_tail值作为key,并将value作为包含该key的所有元组作为其尾巴。然后,您可以使用列表推导来累积字典的值,并使用包含长度小于1的元素。

    tuples = [(1, 2, 2), (3, 1, 3), (1, 2, 4), (8, 9, 2), (12, 1, 2), (0, 1, 3)]
    
    mydict = dict()
    
    create = lambda tupl: mydict.update({tuple_tail(tupl): [tupl]})
    update = lambda tupl: mydict[tuple_tail(tupl)].append(tupl)
    tuple_tail = lambda (first, mid, last): last
    
    populate = lambda tupl: update(tupl) if tuple_tail(tupl) in mydict else create(tupl)
    map(populate, tuples)
    
    print [tuple for tuple in mydict.values() if len(tuple) > 1]
    

    结束结果

    [[(1, 2, 2), (8, 9, 2), (12, 1, 2)], [(3, 1, 3), (0, 1, 3)]]
    

答案 1 :(得分:1)

您可以使用dict将具有相同最后元素的项目分组

x,y= 'x','y'

l = [(x,y,2),(x,y,3),(x,y,4),(x,y,2),(x,y,2),(x,y,3)]
res = {}
for item in l:
  if item[2] not in res:
    res[item[2]] = []
  res[item[2]].append(list(item))

print filter( lambda x: len(x) > 1 , res.values())

[['x', 'y', 2], ['x', 'y', 2], ['x', 'y', 2]], [['x', 'y', 3], ['x', 'y', 3]]

或使用pandas

l = pd.Series( [(x,y,2),(x,y,3),(x,y,4),(x,y,2),(x,y,2),(x,y,3) ])

print [ line[1].tolist() for line in l.groupby( lambda x: l[x][2] ) if len(line[1]) > 1]

[[('x', 'y', 2), ('x', 'y', 2), ('x', 'y', 2)], [('x', 'y', 3), ('x', 'y', 3)]]

答案 2 :(得分:0)

首先,根据最后的元素排序(您可以使用this one

然后,将它们分组。您只需使用textboxes即可。伪代码是:

ng-model

我没有测试过,我不确定语法。