У меня есть следующий список ввода

A = [['A',[1,2,3]],['D',[3,4]],['E',[6,7]],['F',[1]]]

Я хочу иметь подсписки длиной 2. В приведенном выше примере я хочу удалить [A, [1,2,3]], [F, [1]] и т. Д. Я создаю новый список и добавляю все подсписки, чьи длина == 2. Если бы я мог напрямую удалить из A ненужные списки, это было бы идеально

0
brain storm 31 Янв 2013 в 04:34

3 ответа

Лучший ответ

Разве это не должно быть так?

A = [x for x in A if len(x[1]) == 2]

Или даже

A = [[a, b] for a, b in A if len(b) == 2]
2
sberry 31 Янв 2013 в 00:38

Лучше и проще создать новый отфильтрованный список. A[:] = ... является назначением среза, что означает, что содержимое нового списка копируется обратно в A, так что другие ссылки на этот же список будут видеть обновление. Если вам не нужно сохранять личность A, вы можете просто использовать A = ...

>>> A = [['A',[1,2,3]],['D',[3,4]],['E',[6,7]],['F',[1]]]
>>> A[:] = [x for x in A if len(x[1]) == 2]
>>> A
[['D', [3, 4]], ['E', [6, 7]]]

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

1
John La Rooy 31 Янв 2013 в 00:53
A = [x if len(x)==2 for x in A]

Кстати, у ваших списков E и F нет закрывающих скобок, но я предполагаю, что это просто ошибка копирования / вставки или что-то подобное.

0
Colleen 31 Янв 2013 в 00:36