для цикла через стандартный ввод, используя предыдущий элемент - PullRequest
0 голосов
/ 16 января 2019

Я бы хотел сравнить строку с предыдущей без сохранения чего-либо в памяти (без словарей).

Пример данных:

a   2
file    1
file    2
file    4
for 1
has 1
is  2
lines   1
small   1
small   2
test    1
test    2
this    1
this    2
two 1

псевдокод:

for line in sys.stdin:
    word, count = line.split()
    if word == previous_word:
        print(word, count1+count2)

Я знаю, что использовал бы enumerate или dict.iteritems над массивом, но не могу sys.stdin.

Желаемый вывод:

a   2
file    7
for 1
has 1
is  2
lines   1
small   3
test    3
this    3
two 1

Ответы [ 3 ]

0 голосов
/ 17 января 2019

Основная логика - отслеживать предыдущее слово. Если текущее слово соответствует, накапливать счет. Если нет, напечатайте предыдущее слово и его счет и начните все сначала. Есть небольшой специальный код для обработки первой и последней итераций.

stdin_data = [
    "a   2",
    "file    1",
    "file    2",
    "file    4",
    "for 1",
    "has 1",
    "is  2",
    "lines   1",
    "small   1",
    "small   2",
    "test    1",
    "test    2",
    "this    1",
    "this    2",
    "two 1",
]  

previous_word = ""
word_ct = 0

for line in stdin_data:
    word, count = line.split()
    if word == previous_word:
        word_ct += int(count)
    else:
        if previous_word != "":
            print(previous_word, word_ct)
        previous_word = word
        word_ct = int(count)

# Print the final word and count
print(previous_word, word_ct)

Выход:

a 2
file 7
for 1
has 1
is 2
lines 1
small 3
test 3
this 3
two 1
0 голосов
/ 17 января 2019

Ваш код почти там. Хотя не рекомендуется хранить все это в памяти, вам придется хранить совокупные компоненты предыдущей строки:

prev_word, prev_count = '', 0
for line in sys.stdin:
    word, count = line.split()
    count = int(count)
    if word == prev_word:
        prev_count += count
    elif prev_count:
        print(prev_word, prev_count)
        prev_word, prev_count = word, count
0 голосов
/ 17 января 2019

Я бы хотел сравнить строку с предыдущей без сохранения чего-либо в памяти (без словарей).

Чтобы суммировать подсчеты по всем предыдущим строкам с похожим словом, вам нужно сохранить некоторое состояние.

Обычно эта работа подходит для awk. Вы можете рассмотреть эту команду:

awk '{a[$1] += $2} p && p != $1{print p, a[p]; delete a[p]} {p = $1} 
END { print p, a[p] }' file

a 2
file 7
for 1
has 1
is 2
lines 1
small 3
test 3
this 3
two 1

Используя delete, это решение не хранит весь файл в памяти. Состояние сохраняется только на время обработки строк с одним и тем же первым словом.

Awk Ссылки:

...