Функция Python для возврата нового списка без изменения списка ввода - PullRequest
2 голосов
/ 25 февраля 2012

Люди,

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

Кроме того, чтобы избежать ошибок, было бы лучше, если бы я передал кортеж (a) в функцию modify (a) и превратил кортеж в список внутри функции modify (a)?

Большое спасибо за ваш ответ.

def modify(a):
    b = a[:]
    # some changes on b here
    ......
    return b      

Ответы [ 6 ]

5 голосов
/ 25 февраля 2012

Если ваш список содержит какие-либо подсписки, словари или другие «изменяемые» элементы, и ваш алгоритм может вносить в них изменения, то мелкой копии списка, которую oldlist[::-1] дает вам, недостаточно.Используйте deepcopy из модуля copy, чтобы сделать полностью отдельную копию вашего ввода.

from copy import deepcopy
newlist = deepcopy(oldlist)
1 голос
/ 25 февраля 2012

Ваш код выглядит для меня вполне разумно, вы можете заменить b = a[:] на b = list(a), чтобы сделать ваш код более общим. Также нет причин использовать tuple(a). Если вы хотите пойти по этому пути, вы можете позволить modify работать на месте и называть его так: b = modify(a[:]).

0 голосов
/ 25 февраля 2012

Исправление кода без использования a = b[::-1]:

def swapped(b):
    assert len(b) == 2
    return [b[1], b[0]]

Выбор имени функции: swapped для swap, а sorted для sort ... это указывает на то, что аргумент НЕ является мутированным.

Это можно обобщить очень легко:

def gather(sequence, indices):
    return [sequence[i] for i in indices]
0 голосов
/ 25 февраля 2012

Вы можете сделать:

>>> def swap(l):
...   return l[::-1]
... 
>>> my_list = [1,2,3]
>>> swap(my_list)
[3, 2, 1]
>>> my_list
[1, 2, 3]

Неважно, список это или кортеж, он все равно поменяется:)

0 голосов
/ 25 февраля 2012

Это будет сделано только для списка len 2.

Не имеет значения, отправляете ли вы кортеж, но это полностью зависит от вас.

0 голосов
/ 25 февраля 2012

Я не вижу причин, почему это не удовлетворительно:

  • Вы копируете список, поэтому не стоит беспокоиться о том, чтобы случайно его исказить
  • Распаковка кортежей - самый эффективный способ поменять местами две переменные, подобные этой

Так держать, имо.

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