为文本文件行创建排名并仅保留顶行

时间:2017-07-20 14:50:04

标签: python python-3.x text

假设我有一个包含以下几千行的文本文件:

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()

无论如何,非常感谢您的帮助!

4 个答案:

答案 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)