Заполните список нулевых чисел в соответствии с условиями во вложенном списке

#python #list

Вопрос:

Это вопрос, с которым я встретился вчера в интервью, поэтому я не могу предоставить ссылку на исходный вопрос здесь

Вот описание:

Мне дается массив целых чисел, подобных этому [0,2,3], [1,0,0], где нули обозначают недостающие части, которые мне нужно заполнить при соблюдении следующих условий:

  1. Мне также присваивается число k, что означает, что каждое число, которое $a_{i}$ выбирает для заполнения, находится в диапазоне от 1 до k
  2. После заполнения номера список должен быть в следующем порядке: a1<=a2..<=целое(но я не должен изменить порядок индекса, что означает, что я не могу заполнить кучу чисел и отсортировать список)

Вот что я сделал вчера:

 list1 = []
#%%
k = 3
a = [0,2,3]
for i in range(len(a)):
    if a[i] == 0:
        for j in range(1,k 1):
            a[i] = j
            print('a,',a)
            print('list1:',list1)
            if a[0] > a[1]:
                continue
            else:
                print(a)
                rv = 0
                for m in range(1,(len(a)-1)):
                    if a[m] <= a[m 1]:
                        rv =1
                if rv == len(a) - 2:
                    print('value',a)
                    print('before;',list1)
                    list1.append(a.copy())
                    print('after',list1)
 

Это может решить список только с одним нулевым номером, поэтому кто-нибудь может помочь мне решить проблему?

Дополнительное объяснение:

Ответ №1:

Если вам нужно короткое решение, и ваши единственные условия-это номера заполнения от 1 k до, и каждый номер заполнения должен быть равен или больше последнего номера заполнения, это сработает:

 k = 5
a = [0 , 2, 3, 0]
answer = list(map(lambda i: 1 if i==0 else i, a))
 

Это, очевидно, играет на том факте, что все числа заполнения могут быть равными. Если вам нужно более полное и подробное решение с увеличением числа заполнений, вам следует отслеживать текущее/последнее число заполнений за пределами вашего цикла, например:

 k = 5
last_fill = 1
a = [0, 1, 2, 0]
for i in range(len(a)):
    if a[i] == 0:
        if last_fill > k:
            print("Value out of k range!")
            break
        a[i] = last_fill
        last_fill  = 1
 

Перечитывая ваш вопрос, я немного не уверен, хотите ли вы, чтобы весь список был отсортирован в конце или нет. Это, как говорится, вы можете использовать sort , чтобы позаботиться о любой сортировке, как описано выше answer = list(map(lambda i: 1 if i==0 else i, a)).sort() .

Комментарии:

1. Привет, спасибо за ваш ответ. Я думаю, мне нужно подробнее объяснить вопрос, речь идет не о сортировке, вопрос говорит мне, что я не могу изменить порядок индексов исходного списка

2. @SongCalderoneZhang ах. Таким образом, позиция в списке должна быть сохранена для всех ненулевых элементов. В этом случае решение с использованием лямбда-функции работает.