Как создать список, подобный PHP в Python?

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

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

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

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

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

То есть, я хочу уметь это делать:

list = []

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

Да, это похоже на разреженный массив, а не на список (в списках нет дыр, в запасных массивах есть). Таким образом, предложение Неда об использовании словаря кажется разумным, если я правильно помню, как реализованы массивы php.

Aaron Maenpaa 13.01.2009 17:03
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
1
1 459
9
Перейти к ответу Данный вопрос помечен как решенный

Ответы 9

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

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]

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

Ben 13.01.2009 15:53

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

lst = [0] * n

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

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

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

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

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

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

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

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

Совершенно верно - моя настоящая проблема - это несуществующий индекс.

Ben 13.01.2009 15:53

Если количество элементов, которые вам нужны, известно заранее, и вы хотите получить к ним доступ, используя целочисленные, основанные на 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]
Ответ принят как подходящий

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

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 больше похожи на dicts Python, чем на списки Python. Например, у них могут быть строки для ключей.

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

Если вы хотите проиндексировать списки категорий по имени строки, выполните: d [row ["name"]] = c

PEZ 13.01.2009 16:20

Ах ... это похоже на то, что мне нужно. Я попробую. Спасибо!

Ben 13.01.2009 16:41

Отлично - это сделало свою работу. Спасибо!

Ben 13.01.2009 17:04

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

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

1

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

lst = [list_of_categories.index(row["id"]) for row in rows]

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

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"

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

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)

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

Другие вопросы по теме