У меня есть файл со многими строками, каждый из которых имеет более 20 числовых значений, например:
123 1 18 180776 4303656 1605 16468 0 51429 24230 0 0 0 4 8 0 8710 14705 1836 1 4 95 0 24538 0 187860 4264028 449 4711 0 2537 2537 0 0 5 0 0 0 6138 12880 1590 1 22 76 ...
Я бы хотел:
Поэтому после одной строки (с номерами) я должен был:
Каждый номер сравнивается с предыдущим из того же столбца, сохраняя результат, но затем я могу забыть предыдущую строку.
Какой тип данных лучше всего хранить выше данных?
Трудно сказать, какой тип данных был бы лучшим, не зная, что вы собираетесь делать с агрегированной информацией. Однако простым решением было бы использовать список для каждой строки, содержащий 2-кортежи с фактическим числом и словарем с атрибутами:
line = [(1, {'even': False, 'foo': 'bar'}), ..., (2332, {'even': True, 'foo': 'baz'}), ...]
Здесь, как получить этот список, начиная с строки текста:
line = "4 0 2837 9323 ..."
line = [(int(n), dict()) for n in line.split()]
Затем перебираем список и устанавливаем атрибуты:
for n, attributes in line:
...
attributes['foo'] = 'bar'
Обычно вы использовали бы list
для этого
Когда вы читаете строку в переменной, произносите row
row.split()
даст вам list
но каждый элемент будет строкой, а вам нужны цифры. Вы можете получить список чисел (похоже, что они все целые), используя понимание списка, подобное этому
[int(x) for x in row.split()]
вы также можете использовать понимание списка для сравнения с sth
Это фильтрует только элементы, которые являются <sth
[int(x) for x in row.split() if int(x)<sth]
Это возвращает список bool
где True
означает, что соответствующий элемент < sth
[int(x)<sth for x in row.split()]
Посмотрите на NumPy
Стандартные типы данных должны быть хорошими для большинства целей: например, list
или tuple
. Используйте list
если вы будете изменять значения на месте.
Вы должны сделать что-то вроде этого (непроверенный код):
all_the_lines = []
with open("filename.txt", 'r') as f:
for line in f:
data = [int(x) for x in line.split()]
# do something with the data if you want
all_the_lines.append(data)
После этого all_the_lines будет содержать list
list
с необработанными данными (преобразованными в целые числа). Вам нужно выяснить, как вы будете хранить другую информацию, которую хотите сохранить: например, указатели на все элементы, которые были выше определенного числа. Вы можете рассчитать все это во время цикла выше или позже.
Если вы хотите выполнять сверхпрочные математические вычисления на числах (похоже, вы этого не делаете), вместо этого используйте array
из пакета numpy
.
f
вместо вызова readlines()
. readlines()
читает весь файл сразу в память