我有这段代码是从文本文件中获取信息的,该文本文件具有诸如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
答案 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
并不是一个好主意,因为它很重要
值重复多少次(与键无关)
在什么情况下发生,而我们应该计算多少
值已在每个键下读取。
在以下程序中:
代码如下:
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']