Разбор неопределенного количества данных в кортеж Python - PullRequest
2 голосов
/ 14 сентября 2010

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

Однако я немного запутался в том, как лучшеСначала создайте кортеж, поскольку он неизменен.Должен ли я разобрать их в список, а затем поместить их в кортеж?Это расточительно?Есть ли способ сначала поместить их в кортеж без дополнительных затрат на копирование / уничтожение кортежа каждый раз, когда я добавляю новый элемент.

Ответы [ 5 ]

2 голосов
/ 14 сентября 2010

Как вы сказали, вы собираетесь читать данные постепенно - так что кортеж, в конце концов, не очень хорошая идея, поскольку он неизменен.

Есть ли причина не использовать простой список длядержа струны?

1 голос
/ 14 сентября 2010

Поскольку ваши данные меняются, я не уверен, что вам нужен кортеж. Список должен быть в порядке.

Посмотрите на следующее, которое должно предоставить вам дополнительную информацию. Назначение кортежа намного быстрее, чем назначение списка. Но если вы пытаетесь время от времени изменять элементы, тогда создание кортежа может не иметь смысла.

1 голос
/ 14 сентября 2010

Я не буду беспокоиться о накладных расходах: сначала создайте список, а затем кортеж из этого списка. Я предполагаю, что накладные расходы окажутся незначительными, если вы измерите их.

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

0 голосов
/ 14 февраля 2011

Вы можете попробовать использовать цепочечные генераторы для создания вашего кортежа.Вы можете использовать генераторы для выполнения нескольких операций фильтрации и преобразования вашего ввода без создания промежуточных списков.Вся обработка генератора задерживается до итерации.В приведенном ниже примере обработка / итерация происходит в последней строке.

Примерно так:

f = open('settings.cfg')
step1 = (tuple(i.strip() for i in l.split(':', 1)) for l in f if len(l) > 2 and ':' in l)
step2 = ((l[0], ',' in l[1] and 'Tag' in l[0] and l[1].split(',') or l[1]) for l in step1)
t = tuple(step2)
0 голосов
/ 14 сентября 2010
with open("config") as infile:
    config = tuple(infile)
...