2013-02-13 6 views
0

Я ищу для создания тройного вложенного списка в Python. Это должно быть список из N человек, каждый из которых имеет словарь L слов, и для каждого слова, которое я хочу сохранить окончанием (e), и времени, прошедшего с того момента, когда человек последний раз использовал слово (t). Я знаю, как сделать двойной вложенный список, по существу, давая одного человека с лексикой:Динамический тройной вложенный список в Python

individual_vocab = [[e,t] for L in range(L)]

, если у меня было пять слов, это дало бы мне что-то вроде этого:

[[e,t,],[e,t],[e,t],[e,t],[e,t]]

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

Теперь я хочу инициализировать совокупность лиц, каждый из которых имеет этот словарь, и это нормально (на самом деле, предпочтительнее), если в начале это одно и то же, но они должны быть динамическими. Мой первый инстинкт заключается в следующем:

population =[individual_vocab for N in range(N)]

Но, конечно же, проблема заключается в том, что это не является динамическим: все особи в популяции в данном случае являются прямой копией друг друга (т.е. точка в individual_vocab) и, следовательно, не будет изменяться независимо, так что если я сделаю это с N из 3, попробуйте назначить новое значение слову, заканчивающемуся первым словом первого лица, я получаю это (где те е и 2s являются т), которая изменяет окончание первого слова для каждого человека:

населения [0] [0] [0] = "новое окончание"

население

[[['new ending', 2], [1, 2], [1, 2], [1, 2], [1, 2]], [['new ending', 2], [1, 2], [1, 2], [1, 2], [1, 2]], [['new ending', 2], [1, 2], [1, 2], [1, 2], [1, 2]]]

как можно эффективно сделать динамический список списков списков ?

ответ

1

использовать copy модуля:

import copy 

individual_vocab = [[e,t] for l in range(L)] 

population = [copy.deepcopy(individual_vocab) for n in range(N)] 

Добавление моего мнения - я думаю, что этот уровень вложенности должен сделать вам эквивалент питона в Three Star C Programmer. Я бы начал работать с классами в этот момент, чтобы ваш код читался.

+0

Цитируя веб-страницу: * Называемый ThreeStarProgrammer обычно не комплимент. *;) – asheeshr

+0

Спасибо! Это прекрасно работает. И я грязный ужасный программист, поэтому я смиренно соглашусь с этими тремя звездами. Повторное выполнение этого с классами - хорошая идея, хотя у меня нет большого опыта их использования (ясно) - если время позволяет до надвигающегося срока, я могу просто сделать его немного чище, пытаясь это сделать. – Chris

+0

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