【问题标题】:Find an duplicate items at position in 2d list in python在python中的二维列表中的位置查找重复项
【发布时间】:2021-07-27 11:58:45
【问题描述】:

我有一个从 KML 文件中生成的路线编号和坐标的二维列表。顺序是'routenumber','coordinates' 例如:

[['90', '54.93920,25.52,0.0'], ['93', '37.326,19.39,0.0'], ['94', '-110.67,24.395,0.0'], ['95', '-102.154599,17.915081,0.0'], ['96', '-109.177574,25.537,0.0'], ['97', '54.93920,25.52,0.0'], ['98', '55.319,25.506,0.0'], ['911', '54.939206,25.5249,0.0'], ['914', '54.93920,25.52,0.0'], ['915', '54.9169,25.5031,0.0'], ['916', '55.3709,25.35949,0.0'], ['917', '54.939206,25.5249,0.0'], ['920', '56.4641,25.21,0.0'], ['921', '56.4916,25.376,0.0']]

对于列表中的每条路线,我都试图找到具有相同坐标的路线,例如

Output:
54.939206,25.5249,0.0 is seen in 911, 917
54.93920,25.52,0.0 is seen in 90, 97, 914

所以在一个简单的层面上可以识别第二个内部的重复项?的“列”

[['1','10'],['2','50'],['3','10'],['4','0'],['5','50']]

并为我提供:

Output:
10 is seen in 1, 3
50 is seen in 2, 5

我尝试了以下方法,但现在我很纠结,想知道我是否应该改用字典。正如您可能知道的那样,我对python相当陌生。我在这里的论坛上找不到任何关于比较二维列表中某个位置的特定项目的内容(这让我想知道使用字典)

for idx, (route,mcoords) in enumerate(endcoordlist):
    #print(idx, route, coords)
    if any(mcoords in coords for idx, (route,coords) in enumerate(endcoordlist)):    
        print(idx, route, coords)
    

任何帮助将不胜感激。

更新:感谢 sushanth 提供代码。为了便于阅读/像我这样的菜鸟,我对其进行了一些调整,以了解发生了什么。

for v in endcoordlist:
    if groups.get(v[1]):
        print(v[0]," is a duplicate with coordinates:",v[1])
        groups[v[1]].append(v[0])
    
    else:
        groups[v[1]] = [v[0]]
        print(v[1]," is unique")

for k, v in groups.items():
    print(f"{k} seen in {','.join(v)}")

【问题讨论】:

    标签: python list duplicates position 2d


    【解决方案1】:

    这里有一个解决方案,你可以试一试,

    声明一个dict,将坐标作为key,并将路线作为字典的values列表。

    groups = {}
    
    for v in input_:
        if groups.get(v[1]):
            groups[v[1]].append(v[0])
        else:
            groups[v[1]] = [v[0]]
    
    for k, v in groups.items():
        print(f"{k} seen in {','.join(v)}")
    

    54.93920,25.52,0.0 seen in 90,97,914
    37.326,19.39,0.0 seen in 93
    ...
    

    【讨论】:

    • 这是完美的。感谢您如此迅速地回复我。
    【解决方案2】:

    如果您根据坐标对输入列表进行排序,那么您只需要遍历排序列表以查找彼此相等的相邻值。这可能不会为您提供所需的输出格式,但它确实展示了您可以如何做到这一点。可能还有更优雅的方式:-

    RN = [['90', '54.93920,25.52,0.0'], ['93', '37.326,19.39,0.0'], ['94', '-110.67,24.395,0.0'], ['95', '-102.154599,17.915081,0.0'], ['96', '-109.177574,25.537,0.0'], ['97', '54.93920,25.52,0.0'], ['98', '55.319,25.506,0.0'],
          ['911', '54.939206,25.5249,0.0'], ['914', '54.93920,25.52,0.0'], ['915', '54.9169,25.5031,0.0'], ['916', '55.3709,25.35949,0.0'], ['917', '54.939206,25.5249,0.0'], ['920', '56.4641,25.21,0.0'], ['921', '56.4916,25.376,0.0']]
    
    RNS = sorted(RN, key=lambda x: x[1])
    m = set()
    for i in range(len(RNS) - 1):
        if RNS[i][1] == RNS[i + 1][1]:
            coord = RNS[i][1]
            m.add(RNS[i][0])
            m.add(RNS[i + 1][0])
        else:
            if len(m) > 0:
                print(coord, m)
                m = set()
    if len(m) > 0:
        print(coord, m)
    

    【讨论】:

    • 谢谢安迪!另一个快速响应。我已将 Sushanth 的答案标记为正确答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-05
    • 1970-01-01
    • 2017-01-02
    相关资源
    最近更新 更多