删除重复值并查找python中具有最大值的键

时间:2018-10-08 16:32:34

标签: python list directory duplicates

我有这段代码是从文本文件中获取信息的,该文本文件具有诸如key1:value1之类的值,但是其中一些在1键下多次显示。如何删除重复项,之后如何对具有最大和最小值的键进行排序?

def function1(file):
    with open("file_name.txt") as file:
        name = file.read()
    d = {}
    for x in name.split():
        key, value = x.split(':')
        try:
            values = d[key]
        except KeyError:
            values = d[key] = []
        values.append(value)
    return d

3 个答案:

答案 0 :(得分:0)

假设您输入的内容如下:

lines = '''
key1:val1
key2:val2
key3:val3
key1:val4
key1:val5
key2:val6
'''.strip().split()

类似的东西应该可以帮助您入门:

from collections import defaultdict

d = defaultdict(list)

for line in lines:
    k,v = line.split(':')
    d[k].append(v)

items = sorted(d.items(), key=lambda i:len(i[1]))
print(items)

输出(按从最小到最大的值排序,向reverse=True添加sort到最大到最小)

[
  ('key3', ['val3']), 
  ('key2', ['val2', 'val6']), 
  ('key1', ['val1', 'val4', 'val5'])
]

答案 1 :(得分:0)

查看计数器模块:

from collections import Counter
x = Counter(mylist)
print x

答案 2 :(得分:0)

与您的代码相比,改进之处是我使用了defaultdict, 自动为不存在的键生成一个值。

另一个改进是使用re.split进行拆分,因此输入行 可以使冒号被空格包围。

您问题中的一个重要细节是您要数 值重复(我假设,每个键分别)。 因此该程序必须:

  • 检查特定值是否已经保存在 当前密钥,
  • 仅在当前值不存在之前保存当前值(添加到列表中)。

因此,我认为使用Counter并不是一个好主意,因为它很重要 值重复多少次(与键无关) 在什么情况下发生,而我们应该计算多少已在每个键下读取。

在以下程序中:

  • filterValues 函数从输入文件读取行,存储 当前键下的值数组并返回字典,
  • findMinMax 函数查找2个元组(键/值列表),其中一个用于 短裤清单和最长的清单。

代码如下:

from collections import defaultdict
import re

def filterValues(fn):
    with open(fn) as file:
        lines = file.readlines()
    d = defaultdict(list)  # key -> values
    for line in lines:
        key, value = re.split('\s*:\s*',line.strip())
        values = d[key]
        if value not in values:  # Save value, w/o repetitions
            values.append(value)
    return d

def findMinMax(d):
    t1 = min(d.items(), key=lambda x: len(x[1]))
    t2 = max(d.items(), key=lambda x: len(x[1]))
    return t1, t2

d = filterValues('file_name.txt')
print(dict(d))
t1, t2 = findMinMax(d)
print(f'Min. count: {len(t1[1])}: {t1[0]} -> {t1[1]}')
print(f'Max. count: {len(t2[1])}: {t2[0]} -> {t2[1]}')

对于以下示例输入:

K1 : V1
K1 : V2
K1 : V3
K1 : V1
K1 : V4
K1 : V1
K1 : V4
K2 : V5
K2 : V6
K2 : V6
K2 : V6
K3 : V2
K4 : V5

它打印:

{'K1': ['V1', 'V2', 'V3', 'V4'], 'K2': ['V5', 'V6'], 'K3': ['V2'], 'K4': ['V5']}
Min. count: 1: K3 -> ['V2']
Max. count: 4: K1 -> ['V1', 'V2', 'V3', 'V4']