如何在python中合并列表中的重复元素?

时间:2015-10-14 07:11:08

标签: python python-2.7

我有一个坐标列表,如:

list_coordinate =[(9,0),(9,1),(9,3) ... (53,0),(53,1),(53,3)...(54,0),(54,1)..]

value = []

 for m in range(0,len(list_coordinate)):    
    if m != len(list_coordinate)-1:
        if list_coordinate[m][0]==list_coordinate[m+1][0]:
            value.append(list_coordinate[m][0])`

此代码的输出:

value = [9,9 ,9,...,53,53,53,...,54,54,54,54...]

我想合并这个类似元素的值列表,并希望输出为:

预期输出:

 [9,53,54]

4 个答案:

答案 0 :(得分:3)

如果你喜欢单行,你可以这样做:

list(set(map(lambda x: x[0], list_coordinate)))

将输出:

[9, 53, 54]

注意:由于代码中使用了set,​​因此不保证元素的排序。

答案 1 :(得分:1)

您可以使用itertools.groupby

from itertools import groupby
value = [9,9 ,9,53,53,53,54,54,54,54]
g = [k for k,_ in groupby(value)]
print(g)

产生

[9, 53, 54]

并且保证与输入列表的顺序相同(如果重要)。

基本上

groupby(iterable[, keyfunc])

对iterable中的元素进行分组,并在键函数更改时传递给新组。

如果省略了键功能,则假定使用标识功能,并且该组的键将是遇到的每个元素。

因此,只要value中的元素保持不变,它们就会被归为同一个键,即元素本身。

注意:这仅适用于连续重复。如果你想摆脱重复出现的重复项,你应该首先对列表进行排序(由groupby docs解释)

根据您的评论,如果您想直接操作坐标

list_coordinate = [(9,0), (9,1), (9,3), (53,0), (53,1), (53,3), (54,0), (54,1)]
g = [k for k,_ in groupby(list_coordinate, lambda x: x[0])]
print(g)

产生相同的输出

[9, 53, 54]

答案 2 :(得分:1)

您可以对两种情况使用OrderedDict。首先是x坐标:

list_coords = [(9, 0), (9, 1), (9, 3), (53, 0), (53, 1), (53, 3), (54, 0), (54, 1)]
merged = OrderedDict()

for coord in list_coords:
    merged[coord[0]] = 1

print merged.keys()

,并提供:

[9, 53, 54]

注意,如果稍后重复(9, 0),则不会更改输出。

其次,对于整个坐标。请注意,数据重复(10 ,0)次3次:

list_coords = [(9, 0), (9, 1), (9, 3), (10, 0), (10, 0), (10, 0), (53, 0), (53, 1), (53, 3), (54, 0), (54, 1)]
merged = OrderedDict()

for coord in list_coords:
    merged[coord] = 1

print merged.keys()

,并提供:

[(9, 0), (9, 1), (9, 3), (10, 0), (53, 0), (53, 1), (53, 3), (54, 0), (54, 1)]

答案 3 :(得分:0)

为什么不使用套装:

{ k[0] for k in list_coordinate }