【问题标题】:python compare values of dictionary and discard thempython比较字典的值并丢弃它们
【发布时间】:2018-10-10 01:35:01
【问题描述】:

我有一个字典,每个键都有一个键和多个值:

d={'POU': ['GL', '1', '999', '4646']
   'TSA': ['LA', '2', '888', '4545']
   'RAS': ['NA', '5', '565', '1316']
   'TSO': ['RA', '7', '575', '1376']}

每个键的第二个值表示距离(1、2、5、7),单位为公里。并且键是根据距离排序的。

我想比较下一个键的距离,丢弃彼此靠近且距离等于或小于 1km 的键。 所以最终的字典将是:

d={'POU': ['GL', '1', '999', '4646']
   'RAS': ['NA', '5', '565', '1316']
   'TSO': ['RA', '7', '575', '1376']}   

如何做到这一点?

到目前为止,我所做的只是根据距离限制键,例如:

if (float(d[key][1])<10):

但我无法将每个键的值与下一个键的值进行比较。我是 python 的菜鸟,过去两天我一直对它感到疯狂。

【问题讨论】:

  • 字典中的键未排序。
  • @user3650827 你可以使用 OrderedDict 类型来索引键值对。
  • @Scott Hunter 我这样做是在读取一个根据距离对它们进行排序的文件。 d = {} #with open("hypoinv.err") as f: with open("file.txt") as f: for line in f: key, value = line.split(None, 1) d[key] = (value.split()) #order 输出为文件中的顺序 d=collections.OrderedDict(d)
  • @Ari KI 尝试使用:for idx,key in enumerate(d.items()): if ((idx+1, key[1][1]) - (idx, key[1 ][1]))
  • for idx, kv in enumerate(list(d.items()))。您可以使用列表来索引 dict 参考:stackoverflow.com/questions/10058140/…

标签: python dictionary compare


【解决方案1】:

您可以遍历键并在条件匹配时将其删除。

# save keys in a list
vals = list(d.keys())

## count keys
dict_len = len(vals) 

# save keys to be removed
to_rmv = [] 

# iterate through keys
for i in range(dict_len):
    for j in range(i+1, dict_len):
        p = int(d[vals[j]][1])- int(d[vals[i]][1]) ## second index is distance
        if p <= 1:
            to_rmv.append(vals[j])            

## remove keys
for k in to_rmv:
    del d[k]

## see output
print(d)

{'POU': ['GL', '1', '999', '4646'],
 'RAS': ['NA', '5', '565', '1316'],
 'TSO': ['RA', '7', '575', '1376']}

【讨论】:

  • 非常感谢!有效!但我不得不在“for k in to_rmv:”之后添加一个“try”,因为它在我的字典中找到了 2 次相同的键
  • @user3650827 有重复键的字典?以前从未听说过。不错。
【解决方案2】:
keys_to_remove = []
for k1, v1 in d.items():
    for k2, v2 in d.items():
        if k1 == k2:
            continue
        dist1 = float(v1[1])
        dist2 = float(v2[1])
        if abs(dist1 - dist2) <= 1:
            keys_to_remove.append(k2)
result = d.copy()
for k in keys_to_remove:
    result.pop(k)
print(result)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-12-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-06
    相关资源
    最近更新 更多