密集列表矩阵由以下内容组成:元组列表的子列表列表。
为简单起见,我们将讨论第一个“元组列表子列表”:
[[[(390,200),(380,206)],[(381,203),(368,209)],[(359,204),(343,211)],
[(308,197),(284,203)],[(331,196),(303,201)],[(359,196),(351,198)],
[(381,197),(377,203)],[(380,206),(365,213)],[(368,209),(352,215)],
[(343,211),(325,217)],[(284,203),(264,209)],[(303,201),(281,207)],
[(351,198),(322,201)], [(377,203),(364,210)]],...
需要的是(基于(x,y)坐标的每个元组列表的第一个和最后一个索引进行排序和合并;实质上是从段对创建连续的线段。
理想情况下,上述输出表示为:
[[[(390,200),(380,206),(380,206),(365,213)],[(381,203),(368,209),(368,209),
(352,215)],[(359,204),(343,211),(343,211),(325,217)],[(308,197),(284,203),
(284,203),(264,209)],[(331,196),(303,201),(303,201),(281,207)],[(359,196),
(351,198),(351,198),(322,201)],[(381,197),(377,203),(377,203),
(364,210)]],...
...随后排序和合并后的所有副本都会减少......
[[[(390,200),(380,206),(365,213)],[(381,203),(368,209),(352,215)],
[(359,204),(343,211),(325,217)],[(308,197),(284,203),(264,209)],[(331,196),
(303,201),(281,207)],[(359,196),(351,198),(322,201)],[(381,197),(377,203),
(364,210)]],...
尝试创建重复列表,并且使用循环真的没有接近似乎是一个相对简单的排序和合并(对于比我更先进的人)。
更新:
输入数据的过度简化(上图)可能使解决方案比需要的更简单 - 因此以下是矩阵的完整表示:
[[(443390,4.362e+06), (443390,4.362e+06), (443388,4.36202e+06),
(443385,4.36204e+06), (443381,4.36206e+06), (443380,4.36206e+06)],
[(443381,4.36203e+06), (443379,4.36204e+06), (443377,4.36205e+06),
(443375,4.36206e+06), (443370,4.36208e+06), (443368,4.36209e+06)],
[(443359,4.36204e+06), (443357,4.36205e+06), (443354,4.36206e+06),
(443349,4.36208e+06), (443344,4.3621e+06), (443343,4.36211e+06)],
[(443308,4.36197e+06), (443305,4.36198e+06), (443297,4.362e+06),
(443295,4.362e+06), (443287,4.36202e+06), (443284,4.36203e+06)],
[(443331,4.36196e+06), (443329,4.36196e+06), (443317,4.36198e+06),
(443317,4.36198e+06), (443305,4.362e+06), (443303,4.36201e+06)],
[(443359,4.36196e+06), (443357,4.36196e+06), (443357,4.36196e+06),
(443351,4.36198e+06)], [(443381,4.36197e+06), (443380,4.36198e+06),
(443380,4.362e+06), (443379,4.36202e+06), (443377,4.36203e+06)],
[(443380,4.36206e+06), (443377,4.36208e+06), (443376,4.36208e+06),
(443371,4.3621e+06), (443366,4.36212e+06), (443365,4.36213e+06)],
[(443368,4.36209e+06), (443365,4.3621e+06), (443360,4.36212e+06),
(443357,4.36213e+06), (443354,4.36214e+06), (443352,4.36215e+06)],
[(443343,4.36211e+06), (443339,4.36212e+06), (443337,4.36213e+06),
(443333,4.36214e+06), (443327,4.36216e+06), (443325,4.36217e+06)],
[(443284,4.36203e+06), (443281,4.36204e+06), (443277,4.36205e+06),
(443274,4.36206e+06), (443267,4.36208e+06), (443264,4.36209e+06)],
[(443303,4.36201e+06), (443297,4.36202e+06), (443297,4.36202e+06),
(443291,4.36204e+06), (443284,4.36206e+06), (443281,4.36207e+06)],
[(443351,4.36198e+06), (443348,4.36198e+06), (443337,4.36199e+06),
(443327,4.362e+06), (443322,4.36201e+06)], [(443377,4.36203e+06),
(443377,4.36203e+06), (443376,4.36204e+06), (443372,4.36206e+06),
(443367,4.36208e+06), (443364,4.3621e+06)]],...
进一步更新: Martijn Peters提供的方向可能是答案,但是为坐标分配实际值而不仅仅是浓缩显示值表示比较必须更多参与(我想?)。
以下命令:
pathGroup = [[(443390,4.362e+06), (443390,4.362e+06), (443388,4.36202e+06),
(443385,4.36204e+06), (443381,4.36206e+06), (443380,4.36206e+06)],
[(443381,4.36203e+06), (443379,4.36204e+06), (443377,4.36205e+06),
(443375,4.36206e+06), (443370,4.36208e+06), (443368,4.36209e+06)],
[(443359,4.36204e+06), (443357,4.36205e+06), (443354,4.36206e+06),
(443349,4.36208e+06), (443344,4.3621e+06), (443343,4.36211e+06)],
[(443308,4.36197e+06), (443305,4.36198e+06), (443297,4.362e+06),
(443295,4.362e+06), (443287,4.36202e+06), (443284,4.36203e+06)],
[(443331,4.36196e+06), (443329,4.36196e+06), (443317,4.36198e+06),
(443317,4.36198e+06), (443305,4.362e+06), (443303,4.36201e+06)],
[(443359,4.36196e+06), (443357,4.36196e+06), (443357,4.36196e+06),
(443351,4.36198e+06)], [(443381,4.36197e+06), (443380,4.36198e+06),
(443380,4.362e+06), (443379,4.36202e+06), (443377,4.36203e+06)],
[(443380,4.36206e+06), (443377,4.36208e+06), (443376,4.36208e+06),
(443371,4.3621e+06), (443366,4.36212e+06), (443365,4.36213e+06)],
[(443368,4.36209e+06), (443365,4.3621e+06), (443360,4.36212e+06),
(443357,4.36213e+06), (443354,4.36214e+06), (443352,4.36215e+06)],
[(443343,4.36211e+06), (443339,4.36212e+06), (443337,4.36213e+06),
(443333,4.36214e+06), (443327,4.36216e+06), (443325,4.36217e+06)],
[(443284,4.36203e+06), (443281,4.36204e+06), (443277,4.36205e+06),
(443274,4.36206e+06), (443267,4.36208e+06), (443264,4.36209e+06)],
[(443303,4.36201e+06), (443297,4.36202e+06), (443297,4.36202e+06),
(443291,4.36204e+06), (443284,4.36206e+06), (443281,4.36207e+06)],
[(443351,4.36198e+06), (443348,4.36198e+06), (443337,4.36199e+06),
(443327,4.362e+06), (443322,4.36201e+06)], [(443377,4.36203e+06),
(443377,4.36203e+06), (443376,4.36204e+06), (443372,4.36206e+06),
(443367,4.36208e+06), (443364,4.3621e+06)]]
new = [self.sorted_and_merged(tupList) for tupList in pathGroup]
print new
#...from outside method sorted_and_merged()...
return [t for t in sorted(tuplelist) if not (t[0], format(t[1], '.3e'))
in seen or seen_add((t[0], format(t[1], '.3e')))]
结果:
[[(443380,4.36206e+06), (443381,4.36206e+06), (443385,4.36204e+06),
(443388,4.36202e+06), (443390,4.362e+06), (443390,4.362e+06)],
[(443368,4.36209e+06), (443370,4.36208e+06), (443375,4.36206e+06),
(443377,4.36205e+06), (443379,4.36204e+06), (443381,4.36203e+06)],
[(443343,4.36211e+06), (443344,4.3621e+06), (443349,4.36208e+06),
(443354,4.36206e+06), (443357,4.36205e+06), (443359,4.36204e+06)],
[(443284,4.36203e+06), (443287,4.36202e+06), (443295,4.362e+06),
(443297,4.362e+06), (443305,4.36198e+06), (443308,4.36197e+06)],
[(443303,4.36201e+06), (443305,4.362e+06), (443317,4.36198e+06),
(443317,4.36198e+06), (443329,4.36196e+06), (443331,4.36196e+06)],
[(443351,4.36198e+06), (443357,4.36196e+06), (443357,4.36196e+06),
(443359,4.36196e+06)], [(443377,4.36203e+06), (443379,4.36202e+06),
(443380,4.362e+06), (443380,4.36198e+06), (443381,4.36197e+06)],
[(443365,4.36213e+06), (443366,4.36212e+06), (443371,4.3621e+06),
(443376,4.36208e+06), (443377,4.36208e+06), (443380,4.36206e+06)],
[(443352,4.36215e+06), (443354,4.36214e+06), (443357,4.36213e+06),
(443360,4.36212e+06), (443365,4.3621e+06), (443368,4.36209e+06)],
[(443325,4.36217e+06), (443327,4.36216e+06), (443333,4.36214e+06),
(443337,4.36213e+06), (443339,4.36212e+06), (443343,4.36211e+06)],
[(443264,4.36209e+06), (443267,4.36208e+06), (443274,4.36206e+06),
(443277,4.36205e+06), (443281,4.36204e+06), (443284,4.36203e+06)],
[(443281,4.36207e+06), (443284,4.36206e+06), (443291,4.36204e+06),
(443297,4.36202e+06), (443297,4.36202e+06), (443303,4.36201e+06)],
[(443322,4.36201e+06), (443327,4.362e+06), (443337,4.36199e+06),
(443348,4.36198e+06), (443351,4.36198e+06)], [(443364,4.3621e+06),
(443367,4.36208e+06), (443372,4.36206e+06), (443376,4.36204e+06),
(443377,4.36203e+06), (443377,4.36203e+06)]]
似乎有些被挪用了。
答案 0 :(得分:0)
这确实是一种简单的排序和合并;使用sorted()
与removing duplicates while keeping the list ordered一起使用:
def sorted_and_merged(tuplelist):
seen = set()
seen_add = seen.add
return [t for t in sorted(tuplelist, reverse=True) if not (t in seen or seen_add(t))]
将其应用于每个子列表:
[sorted_and_merged(sublist) for sublist in completelist]
演示:
>>> sample = [[(390,200),(380,206),(380,206),(365,213)],[(381,203),(368,209),(368,209),
... (352,215)],[(359,204),(343,211),(343,211),(325,217)],[(308,197),(284,203),
... (284,203),(264,209)],[(331,196),(303,201),(303,201),(281,207)],[(359,196),
... (351,198),(351,198),(322,201)],[(381,197),(377,203),(377,203),
... (364,210)]]
>>> def sorted_and_merged(tuplelist):
... seen = set()
... seen_add = seen.add
... return [t for t in sorted(tuplelist, reverse=True) if not (t in seen or seen_add(t))]
...
>>> from pprint import pprint
>>> pprint([sorted_and_merged(sublist) for sublist in sample])
[[(390, 200), (380, 206), (365, 213)],
[(381, 203), (368, 209), (352, 215)],
[(359, 204), (343, 211), (325, 217)],
[(308, 197), (284, 203), (264, 209)],
[(331, 196), (303, 201), (281, 207)],
[(359, 196), (351, 198), (322, 201)],
[(381, 197), (377, 203), (364, 210)]]