假设我有一个包含以下几千行的文本文件:
Word Number1 Number2
在这个文本文件中,“Word”确实是一个从一行变为另一行的单词,而且数字同样也在改变数字。但是,其中一些词是相同的......请考虑以下示例:
Hello 5 7
Hey 3 2
Hi 7 3
Hi 5 2
Hello 1 4
Hey 5 2
Hello 8 1
什么是读取文本文件的python脚本,并且只保留包含任何给定Word的最高Number1的行(删除所有不满足此条件的行)?上面这个脚本示例的输出是:
Hi 7 3
Hey 5 2
Hello 8 1
注意:输出中行的顺序无关紧要,重要的是满足上述条件。另外,如果对于给定的Word,最高Number1对于两行或更多行是相同的,则输出应该只保留其中一行,这样输出中只有一个出现任何Word。
我不知道如何处理删除方面,但我可以猜测(可能是错误的)第一步是从文本文件中的所有行创建一个列表,即
List1 = open("textfile.txt").readlines()
无论如何,非常感谢您的帮助!
答案 0 :(得分:1)
你可以试试这个:
f = [i.strip('\n').split() for i in open('the_file.txt')]
other_f = {i[0]:map(int, i[1:]) for i in f}
for i in f:
if other_f[i[0]][0] < int(i[1]):
other_f[i[0]] = map(int, i[1:])
new_f = open('the_file.txt', 'w')
for a, b in other_f.items():
new_f.write(a + " "+' '.join(map(str, b))+"\n")
new_f.close()
输出:
Hi 7 3
Hello 8 1
Hey 5 2
答案 1 :(得分:1)
您可以将这些行存储在dict
中,并将字词作为键。为了简化操作,您可以使用第一个数字字段的值存储元组(转换为整数,否则按字典顺序排序)和行。
如果我们第一次遇到这个词,我们会使用dict.setdefault
。
highest = {}
with open('text.txt') as f:
for line in f:
name, val, _ = line.split(' ', 2)
val = int(val)
if val > highest.setdefault(name, (val, line))[0]:
highest[name] = (val, line)
out = [tup[1] for name, tup in highest.items()]
print(''.join(out))
# Hey 5 2
# Hello 8 1
# Hi 7 3
答案 2 :(得分:1)
第一列sorted第一列和第二列作为从高到低的键
然后删除重复的项目
list1 = open(r'textfile.txt').read().splitlines()
output = sorted(list1, key=lambda x:(x.split()[0], int(x.split()[1])), reverse=True)
uniq_key = []
for i in sorted_dat:
key = i.split()[0]
if key in uniq_key:
output.remove(i)
else:
uniq_key.append(key)
>>> output
['Hi 7 3', 'Hey 5 2', 'Hello 8 1']
答案 3 :(得分:0)
因为文件对象是可迭代的,所以不必预先执行readlines。所以让我们打开文件,然后使用for循环迭代它。
fin = open('sometext.txt')
我们创建一个字典来保存结果。
topwords = dict()
现在迭代,通过文件中的行:
for line in fin:
我们剥离新的行字符,并根据空格的位置将行拆分为单独的字符串(split()的默认行为)。
word, val1, val2 = line.strip().split()
val1 = int(val1)
我们检查是否已经看过这个词,如果是,我们检查第一个值是否大于先前存储的第一个值。
if word in topwords:
if val1 > topwords[word][0]:
topwords[word] = [val1, val2]
else:
topwords[word] = [val1, val2]
完成所有单词的解析后,我们返回并迭代顶部单词并将结果打印到屏幕上。
for word in topwords:
output = '{} {} {}'.format(word, *topwords[word])
print(output)
最终脚本如下所示:
fin = open('sometext.txt')
topwords = dict()
for line in fin:
word, val1, val2 = line.strip().split()
val1 = int(val1)
if word in topwords:
if val1 > topwords[word][0]:
topwords[word] = [val1, val2]
else:
topwords[word] = [val1, val2]
for word in topwords:
output = '{} {} {}'.format(word, *topwords[word])
print(output)