Как вы создаете список, как PHP в Python? - PullRequest
1 голос
/ 13 января 2009

Это невероятно простой вопрос (я новичок в Python).

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

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

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

Редактировать: Извините, я не очень четко объяснил, что я искал. Когда я добавляю элементы в список, я не хочу помещать их в последовательности, а хочу вставить их в указанные слоты в списке.

То есть, я хочу быть в состоянии сделать это:

list = []

for row in rows:
  c = list_of_categories.index(row["id"])
  print c
  list[c] = row["name"]

Ответы [ 9 ]

10 голосов
/ 13 января 2009

В зависимости от того, как вы собираетесь использовать список, возможно, вам действительно нужен словарь. Это будет работать:

d = {}

for row in rows:
  c = list_of_categories.index(row["id"])
  print c
  d[c] = row["name"]

... или более компактно:

d = dict((list_of_categories.index(row['id']), row['name']) for row in rows)
print d

Массивы PHP гораздо больше похожи на Python dicts, чем на списки Python. Например, они могут иметь строки для ключей.

И, что странно, в Python есть модуль массива, который описывается как «эффективные массивы числовых значений», что определенно не то, что вам нужно.

4 голосов
/ 13 января 2009

Если количество элементов, которые вы хотите, известно заранее, и вы хотите получить к ним доступ, используя целые, основанные на 0, последовательные индексы, вы можете попробовать это:

n = 3
array = n * [None]
print array
array[2] = 11
array[1] = 47
array[0] = 42
print array

Это печатает:

[None, None, None]
[42, 47, 11]
2 голосов
/ 13 января 2009

http://diveintopython3.ep.io/native-datatypes.html#lists

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

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

2 голосов
/ 13 января 2009

Используйте конструктор списка и добавьте ваши элементы, например так:

l = list ()
l.append ("foo")
l.append (3)
print (l)

дает мне ['foo', 3], что должно быть тем, что вы хотите. См. документацию по списку и документацию по типу последовательности .

РЕДАКТИРОВАТЬ Обновлено

Для вставки используйте insert, например:

l = list ()
l.append ("foo")
l.append (3)
l.insert (1, "new")
print (l)

который печатает ['foo', 'new', 3]

1 голос
/ 13 января 2009

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

class MyList(UserList.UserList):

NO_ITEM = 'noitem'

def insertAt(self, item, index):

    length = len(self)
    if index < length:
        self[index] = item
    elif index == length:
        self.append(item)
    else:
        for i in range(0, index-length):
            self.append(self.NO_ITEM)
        self.append(item)

Возможно, некоторые ошибки в синтаксисе python (не проверялись), но в принципе это должно работать. Конечно, другой случай работает и для elif, но я подумал, что это может быть немного сложнее читать таким образом.

1 голос
/ 13 января 2009

используйте словарь, потому что вы действительно запрашиваете структуру, к которой вы можете получить доступ произвольными ключами

list = {}

for row in rows:
  c = list_of_categories.index(row["id"])
  print c
  list[c] = row["name"]

Затем вы можете перебирать известное содержимое с помощью:

for x in list.values():
  print x

Или проверьте, существует ли что-то в «списке»:

if 3 in list: 
  print "it's there"
1 голос
/ 13 января 2009

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

lst = [list_of_categories.index(row["id"]) for row in rows]
1 голос
/ 13 января 2009

Звучит так, будто вам нужен словарь , а не массив, если вы хотите вставить в указанные индексы.

dict = {'a': 1, 'b': 2, 'c': 3}
dict['a']

1

1 голос
/ 13 января 2009

Вы можете использовать этот синтаксис для создания списка с n элементами:

lst = [0] * n

Но будь осторожен! Список будет содержать n копий этого объекта. Если этот объект изменчив, и вы меняете один элемент, то все копии будут изменены! В этом случае вы должны использовать:

lst = [some_object() for i in xrange(n)]

Затем вы можете получить доступ к этим элементам:

for i in xrange(n):
    lst[i] += 1

Список Python сопоставим с вектором в других языках. Это массив с изменяемым размером, а не связанный список.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...