Как я могу обновить список, как только элемент был удален из списка в списке в Python - PullRequest
3 голосов
/ 21 марта 2012

Это довольно сложно, но я хотел бы иметь возможность обновить больший список, как только элемент был удален из мини-списка в большем списке.

listA = ['1','2','3','4','5','6','6','8','9','5','3','7']

Я использовал приведенный ниже код, чтобы разбить его на списки по трое

split = [listA[i:(i+3)] for i in range(0, len(listA) - 1, 3)]

print(split)

# [['1','2','3'],['4','5','6'],['6','8','9'],['5','3','7']]

split = [['1','2','3'],['4','5','6'],['6','8','9'],['5','3','7']]

если я удалил #3 из первого списка, разделение теперь будет

del split[0][-1]
split = [['1','2'],['4','5','6'],['6','8','9'],['5','3','7']]

после удаления #3, я хотел бы иметь возможность обновить список так, чтобы он выглядел;

split = [['1','2','4'],['5','6','6'],['8','9','5'],['3','7']]

заранее спасибо

Ответы [ 4 ]

3 голосов
/ 21 марта 2012

Не уверен, насколько велик этот список, но вам нужно сгладить его и пересчитать:

>>> listA = ['1','2','3','4','5','6','6','8','9','5','3','7']
>>> split = [listA[i:(i+3)] for i in range(0, len(listA) - 1, 3)]
>>> split
[['1', '2', '3'], ['4', '5', '6'], ['6', '8', '9'], ['5', '3', '7']]
>>> del split[0][-1]
>>> split
[['1', '2'], ['4', '5', '6'], ['6', '8', '9'], ['5', '3', '7']]
>>> listA = sum(split, []) # <- flatten split list back to 1 level
>>> listA
['1', '2', '4', '5', '6', '6', '8', '9', '5', '3', '7']
>>> split = [listA[i:(i+3)] for i in range(0, len(listA) - 1, 3)]
>>> split
[['1', '2', '4'], ['5', '6', '6'], ['8', '9', '5'], ['3', '7']]
2 голосов
/ 21 марта 2012

Просто заново создайте единый список из ваших вложенных списков, а затем снова разделите.

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

rejoined = [element for sublist in split for element in sublist]

Нет никаких сомнений в причудливых способах или в однострочниках, которые используют itertools или какую-то другую библиотеку, но не задумываются над этим. Если вы говорите только о нескольких сотнях или даже нескольких тысячах предметов, это решение вполне достаточно.

2 голосов
/ 21 марта 2012

Мне это нужно для переворачивания карт в колоде в пасьянсе.

Вы можете раздавать свои карты, используя itertools.groupby() с хорошей функцией клавиш:

def group_key(x, n=3, flag=[0], counter=itertools.count(0)):
    if next(counter) % n == 0:
        flag[0] = flag[0] ^ 1
    return flag[0]

^ - побитовый оператор , в основном он меняет значение флага с 0 на 1 и наоборот.Значение флага является элементом списка, потому что мы делаем какие-то заметки.

Пример:

>>> deck = ['1', '2', '3', '4', '5', '6', '6', '8', '9', '5', '3', '7']
>>> for k,g in itertools.groupby(deck, key=group_key):
...     print(list(g))
['1', '2', '3']
['4', '5', '6']
['6', '8', '9']
['5', '3', '7']

Теперь предположим, что вы использовали карту '9' и '8', так что ваша новая колода выглядит так:

>>> deck = ['1', '2', '3', '4', '5', '6', '6', '5', '3', '7']
>>> for k,g in itertools.groupby(deck, key=group_key):
...     print(list(g))
['1', '2', '3']
['4', '5', '6']
['6', '5', '3']
['7']
0 голосов
/ 21 марта 2012

Создание объекта, который содержит список и отслеживает изменение списка (возможно, путем управления записью в него), а затем заставляет объект выполнять свое собственное разделение при каждом изменении данных и сохраняет разделенный список в элементе объект.

...