Максимальные значения из текстового файла с несколькими столбцами - PullRequest
0 голосов
/ 11 декабря 2018

После некоторых вычислений у меня есть текстовый файл в формате:

word1 word2 0.1111 hyp1 hyp2 0.1111111111111111
word3 word4 0.2 hyp3 hyp4 0.07692307692307693
word5 word6 0.2 hyp5 hyp6 0.3333333333333333

Таким образом, у него есть 6 столбцов, два слова, которые имеют значение, а затем рядом с этими 2 гипернамикоторые имеют значение.

Моя цель - получить 10 лучших пар самых высоких значений и записать в файл (а не ту часть, над которой я борюсь)

Мой вопрос: какой подход мне выбрать?так что он смотрит на столбцы 3 и 6, а затем помещает в файл столбец 1,2,3 или 4,5,6 в файле ... так что я мог бы получить текстовый файл, похожий на:

chapter tom 0.08333333333333333 section black 0.1
answer tom 0.09090909090909091 statement black 0.1111111111111111
boy wonder 0.08333333333333333 man astonishment 0.09090909090909091
tom answer 0.09090909090909091 turkey statement 0.058823529411764705
old lady 0.08333333333333333 past woman 0.1
pulled spectacle 0.1111111111111111 tear sight 0.1111111111111111

Ответы [ 3 ]

0 голосов
/ 11 декабря 2018

Попробуйте:

import re


data = [
    "word1 word2 0.1111 hyp1 hyp2 0.1111111111111111",
    "word3 word4 0.2 hyp3 hyp4 0.07692307692307693",
    "word5 word6 0.2 hyp5 hyp6 0.3333333333333333"]

pattern = r"^(\S+\s\S+\s\d+.\d+)\s(\S+\s\S+\s\d+.\d+)$"
pairs = []
for line in data:
    match = re.match(pattern, line)
    pairs.append(match.group(1).split())
    pairs.append(match.group(2).split())

for pair in pairs:
    print(pair)

print("======")

pairs.sort( key=lambda value: float(value[2]))

for pair in pairs:
    print(pair)

Вывод:

['word1', 'word2', '0.1111']
['hyp1', 'hyp2', '0.1111111111111111']
['word3', 'word4', '0.2']
['hyp3', 'hyp4', '0.07692307692307693']
['word5', 'word6', '0.2']
['hyp5', 'hyp6', '0.3333333333333333']
======
['hyp3', 'hyp4', '0.07692307692307693']
['word1', 'word2', '0.1111']
['hyp1', 'hyp2', '0.1111111111111111']
['word3', 'word4', '0.2']
['word5', 'word6', '0.2']
['hyp5', 'hyp6', '0.3333333333333333']

После сортировки вы можете записать эти данные в файл:

with open('new_file_name', 'w') as new_file:
    for pair in pairs:
        new_file.write(' '.join(pair))
0 голосов
/ 11 декабря 2018

вот мое решение

import re

def my_sort(val):
    pattern = r'[0-9]+\.[0-9]+'
    p = re.findall(pattern, val)
    return float(p[0])

with open('test.txt', 'r') as f:
    txt = f.read()

pattern1 = r'[a-z]+[0-9]* [a-z]+[0-9]* [0-9]+\.[0-9]+'
p1 = re.findall(pattern1,txt)
p1.sort(key=my_sort)
result = p1[::-1]

with open('text2.txt','w') as f:
    for i in result:
        f.write(i+'\n')

вывод в файл text2.txt

hyp5 hyp6 0.3333333333333333
word5 word6 0.2
word3 word4 0.2
hyp1 hyp2 0.1111111111111111
word1 word2 0.1111
hyp3 hyp4 0.07692307692307693

с другим примером:

tear sight 0.1111111111111111
pulled spectacle 0.1111111111111111
statement black 0.1111111111111111
past woman 0.1
section black 0.1
tom answer 0.09090909090909091
man astonishment 0.09090909090909091
answer tom 0.09090909090909091
old lady 0.08333333333333333
boy wonder 0.08333333333333333
chapter tom 0.08333333333333333
turkey statement 0.058823529411764705
0 голосов
/ 11 декабря 2018

Загрузить файл в фрейм данных Pandas:

import pandas as pd
df = pd.read_csv('input.txt', sep=' ', header=None)

Разделить фрейм данных на два фрейма данных, df_left (первые три столбца) и df_right (последние три столбца):

df_left = df.iloc[:, :3]
df_right = df.iloc[:, 3:]

Добавить df_right ниже df_left.Обратите внимание, что нам нужно переименовать столбцы одного из фреймов данных, чтобы добавление работало правильно:

df_right.columns = [0, 1, 2]
df = df_left.append(df_right)

Сортировать фрейм данных по значениям в последнем столбце (т. Е. Столбцы № 2) вв порядке убывания:

df = df.sort_values(2, ascending=False)

Наконец, сохраните фрейм данных в файл:

pd.to_csv('output.txt', sep=' ', header=None, index=None)
...