【问题标题】:De-duplicating list of tuples, preferring certain ones [closed]重复删除元组列表,更喜欢某些[关闭]
【发布时间】:2014-09-04 13:13:16
【问题描述】:

我有一个包含三个项目元组的列表。前两项通常是重复项(GPS 坐标),而最后一项是分数(信号强度)

[(62.45807, -114.41026, 8),
(62.45807, -114.41026, 11),
(62.45807, -114.41026, 18),
(62.45807, -114.41026, 16),
(62.45807, -114.41026, 9),
(62.45785, -114.41003, 23),
(62.45785, -114.41003, 19),
(62.45785, -114.41003, 11),
(62.45785, -114.41003, 17),
(62.45785, -114.41003, 14),
(62.45785, -114.41003, 11),
(62.45785, -114.41003, 15),
(62.45765, -114.40978, 28),
(62.45765, -114.40978, 16),
(62.45765, -114.40978, 10),
(62.45765, -114.40978, 15),
(62.45765, -114.40978, 25)]

我想知道如何删除重复的 GPS 坐标,同时希望以最高分结束:

[(62.45807, -114.41026, 18),
(62.45785, -114.41003, 23),
(62.45765, -114.40978, 28)]

以及如何做同样的事情,但平均分数以得到这样的结果

[(62.45807, -114.41026, 12),
(62.45785, -114.41003, 16),
(62.45765, -114.40978, 19)]

【问题讨论】:

  • 你是如何解决这个问题的?
  • pandas 有你想要的功能。这里有类似的问题:stackoverflow.com/questions/12497402/…
  • 请问答案“太宽泛”如何?我提供了样本输入、预期输出并描述了从一个到另一个的条件。我也得到了及时的答复。我想了解如何将这个问题做得更好以供将来参考。谢谢。

标签: python list duplicates tuples


【解决方案1】:

听起来像是itertools.groupby 的工作:

>>> from itertools import groupby

最大:

>>> [max(g, key=lambda x:x[-1]) for k, g in groupby(data, key= lambda x:x[:2])]
[(62.45807, -114.41026, 18),
 (62.45785, -114.41003, 23),
 (62.45765, -114.40978, 28)]

平均:

>>> [a + (round(sum(c for _, _, c in b)/float(len(b))),) 
                        for a, b in ((k, list(g)) for k, g in 
                                           groupby(data, key= lambda x:x[:2]))]
[(62.45807, -114.41026, 12.0),
 (62.45785, -114.41003, 16.0),
 (62.45765, -114.40978, 19.0)]

【讨论】:

  • 谢谢!这很简洁,可以解决问题。
【解决方案2】:

您可以创建一个函数将每个值映射到一个字典中,其中一个键作为 GPS 坐标,其中的值是一个分数列表

def create_gps_score_dict(gps_score_list):
    gps_score_dict = {}
    for gps_score in gps_score_list:
        if (gps_score[0], gps_score[1]) in gps_score_dict.keys():
            gps_score_dict[(gps_score[0], gps_score[1])].append(gps_score[2])
        else:
            gps_score_dict[(gps_score[0], gps_score[1])] = [gps_score[2]]
    return gps_score_dict

现在您可以查看这个简单的字典来生成结果。

def max_gps_scores(gps_score_dict):
    gps_score_list = []
    for gps, score in gps_score_dict.items():
        gps_score_list.append((gps[0], gps[1], max(score))

例子

>>> gps_score_list=[(62.45807, -114.41026, 8),
    (62.45807, -114.41026, 11),
    (62.45807, -114.41026, 18),
    (62.45807, -114.41026, 16),
    (62.45807, -114.41026, 9),
    (62.45785, -114.41003, 23),
    (62.45785, -114.41003, 19),
    (62.45785, -114.41003, 11),
    (62.45785, -114.41003, 17),
    (62.45785, -114.41003, 14),
    (62.45785, -114.41003, 11),
    (62.45785, -114.41003, 15),
    (62.45765, -114.40978, 28),
    (62.45765, -114.40978, 16),
    (62.45765, -114.40978, 10),
    (62.45765, -114.40978, 15),
    (62.45765, -114.40978, 25)]

>>> max_gps_scores(create_gps_score_dict(gps_score_list))
[(62.45807, -114.41026, 18), (62.45765, -114.40978, 28), (62.45785, -114.41003,23)]

平均数由你决定!

【讨论】:

    猜你喜欢
    • 2013-01-13
    • 1970-01-01
    • 2019-02-01
    • 1970-01-01
    • 2012-10-13
    • 1970-01-01
    • 2013-05-28
    • 2018-09-04
    • 1970-01-01
    相关资源
    最近更新 更多