2014-02-11 3 views
2

Код:Лучший способ, чтобы очистить список и словарь

num_of_iterations_for_outer_loop = 2 
num_of_iterations_for_inner_loop = 3 
data = [] 

for j in range(num_of_iterations_for_outer_loop): 
    lst2 = [] 
    for k in range(num_of_iterations_for_inner_loop): 
     lst1 = {} 
     lst1['1'] = "first_value" # these are not default, in my original code they are coming from some other values after calculation 
     lst1['2'] = "second_value" 
     lst1['3'] = "third_value" 

     lst2.append(lst1) 

    value = {'values':lst2} 
    data.append(value) 

Во внешнем цикле я должен очистить lst2 список снова и снова для повторного использования его.

Во внутреннем цикле я должен снова и снова очищать словарь lst1 для его повторного использования.

Я знаю 2 способа очистки списка:

  1. del lst2[:]

  2. lst2 = []

и 1 способ очистки словаря:

  1. lst1 = {}

Но я не знаю различий между этими методами и какой из них я должен использовать.

Есть ли другой способ очистки списка и словаря? И лучший способ, и почему?

Есть ли лучший способ написать весь код?

ответ

4

Здесь краткое представление о том, что делает каждый метод:

  1. lst2 = [] делает не фактически очистить содержимое списка. Он просто создает новый пустой список и присваивает ему имя lst2. Затем задачей GC является удаление фактического содержимого на основе оставшихся ссылок.

    >>> a = [1,2,3] 
    >>> b = a 
    >>> a = [] 
    >>> a 
    [] 
    >>> b 
    [1, 2, 3] 
    
  2. del lst2[:] очищает содержимое списка на месте.

    >>> a = [1,2,3] 
    >>> b = a 
    >>> del a[:] 
    >>> a 
    [] 
    >>> b 
    [] 
    

    Обратите внимание, что другой список b также очищается, поскольку содержимое удаляется на месте.

  3. lst1 = {} такой же, как пункт 1. Он создает пустой словарь и присваивает ссылку на имя lst1.

Другой метод, чтобы очистить список в месте является:

lst2[:] = [] 
0

Задания - довольно хорошие и эффективные методы для очистки списка или dict.

my_dict = {}

и my_list = []

Ничего особенного нужно.

+0

Ни один из тех, кто на самом деле заявление очистить содержимое соответствующих объектов. Они просто создают новые, пустые контейнеры и присваивают их каждому имени. Я считаю, что OP хочет, чтобы это было сделано _in-place_. – martineau

+0

@martineau Держу пари, что они этого не делают, таким образом они просто получат «данные», содержащие целую кучу ссылок на тот же список, содержащий целую кучу ссылок на один и тот же словарь, и будут прямо здесь, жалуясь, что они всегда видят, что последние значения повторяются снова и снова. – jonrsharpe

1

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

>>> l = [1, 2, 3] 
>>> d = {'a': l} 
>>> del l[:] 
>>> d 
{'a': []} 

Кроме того, вы можете del все пары ключ-значение из словаря, но у вас будет такая же проблема. Когда вы помещаете исходные объекты контейнера в какой-либо другой контейнер, вы должны создать новый контейнер путем назначения (например, lst1 = {}) в каждом цикле.

Есть ли лучший способ написать весь код?

Я не знаю, что еще вы делаете с данными, но словарь value может оказаться ненужным, и три-кортеж из сокровенных данных может быть достаточно:

data = [[(1, 2, 3), (4, 5, 6)], [(7, 8, 9), ...], ...] 
+0

Метод 'dict.clear()' быстро удалит все элементы в словаре на месте. – martineau

Смежные вопросы