我有一个坐标列表,如:
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]
答案 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 }