Python - как хранить строки числовых значений?

1

У меня есть файл со многими строками, каждый из которых имеет более 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
...

Я бы хотел:

  1. читать одну строку
  2. сохранить его в некоторых типах данных python (что было бы лучше?)
  3. выполните некоторые операции над каждым числом, взятым из приведенной выше строки, например:
    • проверьте, не находится ли он выше sth (и сохраните результат)
    • проверьте, не ниже ли он (и сохраните результат)
    • подсчитайте его длину (количество цифр) (и сохраните результат)
    • сравните его с предыдущим номером из того же столбца -

Поэтому после одной строки (с номерами) я должен был:

  1. хранить каждый номер
  2. хранить дополнительные атрибуты для каждого номера

Каждый номер сравнивается с предыдущим из того же столбца, сохраняя результат, но затем я могу забыть предыдущую строку.

Какой тип данных лучше всего хранить выше данных?

  • 0
    «СТГ»? Что такое "чч"? Кроме того, пожалуйста, пометьте свою домашнюю работу как [домашнее задание].
  • 0
    sth = сокращение от «что-то», обычно. Хотя все цифры выше чего-то.
Показать ещё 3 комментария
Теги:

4 ответа

2
Лучший ответ

Трудно сказать, какой тип данных был бы лучшим, не зная, что вы собираетесь делать с агрегированной информацией. Однако простым решением было бы использовать список для каждой строки, содержащий 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'
  • 0
    Что такое функция dict ()? Чтобы было место для дополнительных атрибутов?
  • 0
    @przemol: да. Вы сказали, что хотите «хранить дополнительные атрибуты для каждого номера» . Вот для чего здесь словари. Конечно, существует множество других способов хранения метаданных о числах - это зависит от метаданных и того, как вы собираетесь их использовать впоследствии.
4

Обычно вы использовали бы 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()]
  • 0
    Как я могу сравнить некоторое значение с предыдущим значением из того же столбца?
0
0

Стандартные типы данных должны быть хорошими для большинства целей: например, 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.

  • 1
    Лучше просто перебирать f вместо вызова readlines() . readlines() читает весь файл сразу в память
  • 0
    К сожалению, я думал, readlines () вернул ленивый итератор. изм.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню