Python - заполнение пробелов в списке - PullRequest
0 голосов
/ 16 февраля 2019

У меня есть список из кортежей, сгенерированный из запроса к базе данных, например:

list = [(0,1,1), (1,2,1), (2,4,3), (4,2,1)]

Первое число в каждом кортеже должно быть последовательным числом от 0 до 15. Также может бытьпропущенные, и я ищу лучший способ заполнить пробелы.

В настоящее время я делаю это с помощью циклического прохождения, но, будучи нубом Python, я считаю, что он небрежный, и есть лучшие способы:

# first fill in gaps
cnt = 0
for a,b,c in list:
    if a > cnt:
        list.insert(cnt, tuple((cnt, 0, 0)))
    cnt += 1

# then add any missing at end
while cnt < 16:
    list.append(tuple((cnt, 0, 0)))
    cnt += 1

Итак, ожидаемый результат для списка в начале будет:

list = [(0,1,1), (1,2,1), (2,4,3), (3,0,0), (4,2,1), (5,0,0), (6,0,0), (7,0,0), (8,0,0), (9,0,0), (10,0,0), (11,0,0), (12,0,0), (13,0,0), (14,0,0), (15,0,0)]

Ответы [ 3 ]

0 голосов
/ 16 февраля 2019

Есть много способов, вы можете создать новый список, например так:

data = [(0,1,1), (1,2,1), (2,4,3), (4,2,1)]

out = []
for i in range(16):
    if data and i == data[0][0]:
        out.append(data.pop(0))
    else:
        out.append((i, 0, 0))

print(out)
# [(0, 1, 1), (1, 2, 1), (2, 4, 3), (3, 0, 0), (4, 2, 1), 
# (5, 0, 0), (6, 0, 0), (7, 0, 0), (8, 0, 0), (9, 0, 0), 
# (10, 0, 0), (11, 0, 0), (12, 0, 0), (13, 0, 0), (14, 0, 0), (15, 0, 0)]

В качестве примечания я переименовал ваш список в data, так как лучше избегать использования имен встроенныхфункционирует как переменные.

0 голосов
/ 16 февраля 2019

Чтобы представить некоторые интересные языковые возможности, которые можно использовать для решения этой проблемы, предлагаем решение на основе стабильной сортировки Python с простой функцией ключа сортировки и itertools.groupby() для группировки элементов на основе индекса.

Затем вы берете первое из двух, если у вас был этот индекс во входных данных.Или элемент по умолчанию, если не было ни одного с этим индексом.

import itertools

received_items = [(0,1,1), (1,2,1), (2,4,3), (4,2,1)]
print(received_items)

default_items = [(i, 0, 0) for i in range(16)]

# append default items at the end
data = received_items + default_items
# perform stable sort on the index (first element) selected via key function
keyfunc = lambda x: x[0]
data.sort(key=keyfunc)
# always take first item for each index group
out = [next(v) for k,v in itertools.groupby(data, key=keyfunc)]

print(out)

Вывод:

[(0, 1, 1), (1, 2, 1), (2, 4, 3), (4, 2, 1)]
[(0, 1, 1), (1, 2, 1), (2, 4, 3), (3, 0, 0), (4, 2, 1), (5, 0, 0), (6, 0, 0), (7, 0, 0), (8, 0, 0), (9, 0, 0), (10, 0, 0), (11, 0, 0), (12, 0, 0), (13, 0, 0), (14, 0, 0), (15, 0, 0)]

Для справки:

0 голосов
/ 16 февраля 2019

Вы можете преобразовать список кортежей в диктовку, индексированную первыми элементами кортежей, чтобы вы могли перебирать диапазон от 0 до 15, чтобы найти недостающие индексы и вывести значения по умолчанию для них в понимании списка:

l = [(0,1,1), (1,2,1), (2,4,3), (4,2,1)]
d = {k: v for k, *v in l}
print([(i, *d.get(i, (0, 0))) for i in range(16)])

Это выводит:

[(0, 1, 1), (1, 2, 1), (2, 4, 3), (3, 0, 0), (4, 2, 1), (5, 0, 0), (6, 0, 0), (7, 0, 0), (8, 0, 0), (9, 0, 0), (10, 0, 0), (11, 0, 0), (12, 0, 0), (13, 0, 0), (14, 0, 0), (15, 0, 0)]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...