Заполнить список списка условиями - PullRequest
0 голосов
/ 28 апреля 2020

У меня есть список списка 1 listoflist = [[],[],[],[],[]] и я хочу заполнить его данными из этой функции:

def _execute():
    while True:
        user_input = input("type in: ")
        return user_input

Я пытаюсь вставить данные из функции ввода в первый столбец, например:

input = 1
[[1],[],[],[],[]]
input = 2
[[1,2],[],[],[],[]]

Если длина первого столбца больше 2, то переходите к следующему столбцу до последнего.

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

def insertdata(data):
    for i in range(len(listoflist)):
        if len(listoflist[0]) < 2:
            listoflist[0].append(data)

        else:
            print(listoflist)
            break


insertdata(_execute())



# output
type in: 1
[['1', '1'], [], [], [], []]


Нужно ли выполнять эту операцию с индексированием?

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

Ответы [ 3 ]

2 голосов
/ 28 апреля 2020

Вы можете вывести while True из функции _execute() (каждый раз, когда вы возвращаетесь, while пропускается) и оставить флажок, чтобы указать, были ли ваши данные добавлены или нет, кроме того, проверьте границы, чтобы избежать Ошибки индекса:

listoflist = [[], [], [], [], []]

def _execute():
    user_input = input("type in: ")
    return user_input

def insertdata(data):
    data_added = False
    i, n = 0, len(listoflist)
    while not data_added and i < n:
        if len(listoflist[i]) < 2:
            listoflist[i].append(data)
            data_added = True
        else:
            i += 1
    if i == n:
        print("\n The list is full, No more elements will be added \n")

while True:
    insertdata(_execute())
    print(listoflist)

1 голос
/ 28 апреля 2020

Может быть, это по другой причине, но while True в вашем _execute() не требуется, поскольку input блокирует. Далее я справедливо прокомментировал, что ваш кодовый блок делает

def insertdata(data):
    for i in range(len(listoflist)): #execute the following code for the amount of lists in listoflist, namely 5 times
        if len(listoflist[0]) < 2: #if you have less than 2 elements in the first element of listoflist
            listoflist[0].append(data) # append data to the first element

        else:
            print(listoflist)
            break

для правильной функции, см. Ответ RMPR.

0 голосов
/ 28 апреля 2020

Вам просто нужно найти первый список в списке списков с пробелом для обработки пользовательского ввода. После добавления пользовательского ввода вы можете просто вернуться - больше ничего не нужно делать. Вы получаете двойное добавление, потому что append() находится в for-l oop

Вам также следует учитывать случай, когда больше элементов не может быть добавлено:

listoflist = [[],[],[],[],[]]

def _execute():
    while True:
        user_input = input("type in: ")
        return user_input

def insertdata(data):
    for l in listoflist:
        if len(l) < 2:
            l.append(data)
            return
    else:
        print("no more space")


while True:
    insertdata(_execute())
    print(listoflist)

Вывод :

type in: 1
[['1'], [], [], [], []]
type in: 1
[['1', '1'], [], [], [], []]
type in: 1
[['1', '1'], ['1'], [], [], []]
type in: 1
[['1', '1'], ['1', '1'], [], [], []]
type in: 1
[['1', '1'], ['1', '1'], ['1'], [], []]
type in: 1
[['1', '1'], ['1', '1'], ['1', '1'], [], []]
type in: 1
[['1', '1'], ['1', '1'], ['1', '1'], ['1'], []]
type in: 1
[['1', '1'], ['1', '1'], ['1', '1'], ['1', '1'], []]
type in: 1
[['1', '1'], ['1', '1'], ['1', '1'], ['1', '1'], ['1']]
type in: 1
[['1', '1'], ['1', '1'], ['1', '1'], ['1', '1'], ['1', '1']]
type in: 1
no more space
[['1', '1'], ['1', '1'], ['1', '1'], ['1', '1'], ['1', '1']]
...