2014-11-04 5 views
1

У меня есть функция func(L), которая делает некоторое обновление в списке L (без вставки или удаления элементов, просто изменяя значения в элементах L). Я хочу, чтобы применить его к подсписку некоторых большого списка bigL выбранного условием:Манипулирование подсписок в Python

L = [x for x in bigL if cond(x)] 

так, что после func(L) выполняются, эти элементы в bigL изменяются соответственно. В C/C++ я просто создал список ссылок/указателей на нужные мне элементы, но как это сделать в Python, где нет явных указателей?

+0

Не могли бы вы предоставить конкретный вариант использования? Ваш вопрос нечеткий. –

+0

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

+0

@ 200_success bigL - это список всех заказов из обмена (ака заказа), cond (x) указывает, если я торгую против порядка x раньше в среде моделирования. func (L) вычитает мои смоделированные заполнения из заказов, поэтому результат дает мне книгу заказов, как будто мои сделки действительно выполнялись. –

ответ

0

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

L = [(i,x) for i,x in enumerate(bigL) if cond(x)] 
indlist,L = zip(*L) # split up index and value lists 
# ... modify L ... 
for i,x in zip(indlist, L): 
    L[i] = x 
0

Не ясно из Вашего вопроса: является подсписка Bigl без пробелов? Если есть пробелы, @nneonneo решение в порядке, althoug вы будете цикл над bigL дважды, один раз, чтобы найти индексы и один раз, чтобы заменить значения в bigL.

Но если L является непрерывным подсписком bigL я бы изменить ваши cond функцию возвращают первый и последний индекс bigL:

start, end = cond(bigL) 
bigL[start:end] = func(bigL[start:end]) 
+0

К сожалению, могут быть пробелы. –

1

Вы также можете использовать один, модифицированный список понимание с тройным (<thing> if <cond> else <other>):

[x if cond(x) else func(x) for x in bigL].

На мой взгляд, это больше python-esque, но мнения здесь будут меняться ... просто хотел поместить его там.

+0

Из небольшой информации, которая задана в вопросе и комментариях, 'func()' должен иметь возможность работать с отдельными элементами и не должен работать в списке. Поэтому это звучит как хороший подход. –

+0

func (L) должен увидеть весь L, прежде чем решить, как его обновить, но я подумаю об этом. В противном случае я согласен, что это самый элегантный. –