Как составить двумерный список из входных данных, предоставленных пользователем? - PullRequest
0 голосов
/ 01 ноября 2019

Я хочу взять несколько входных данных от пользователя и сохранить данные в двумерном списке.

Но при этом я сталкиваюсь с проблемой, которая заключается в том, что когда я использовал для очистки список2, данные «Финального списка (список3)» также очищаются.

Итак, в основном желаемый результат должен выглядеть следующим образом [[2,3,5], [7,8,9], [8,6,3]] после получения 3 входных данных от пользователя.

Но после первого ввода вывод списка выглядит следующим образом [[2,3,5]], и при самой следующей записи список очищается, и следующий вывод [[7,8,9], [7,8,9]].

Какие изменения необходимо внести в код?

list1 = []
list2 = []
list3 = []

while True:

    val1 = input("Input value1 ")
    list1.append(val1)
    val2 = input("Input value2 ")
    list1.append(val2)
    val3 = input("Input value ")
    list1.append(val3)
    for element in list1:
        list2.append(element)

    print(list2)
    list3.append(list2)
    print(list3)
    list1.clear()
    list2.clear()

    response = input(print("Do you want to continue ? (Y/N) :  "))
    if response.upper() == "Y":
        continue
    else:
        break

Вывод:

Input value1 2
Input value2 3
Input value 5
['2', '3', '5']
[['2', '3', '5']]
Do you want to continue ? (Y/N) : y
Input value1 7
Input value2 8
Input value 9
['7', '8', '9']
[['7', '8', '9'], ['7', '8', '9']]

Ответы [ 5 ]

1 голос
/ 01 ноября 2019

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

resultList = []

while True:
    val1 = input("Input value1 ")
    val2 = input("Input value2 ")
    val3 = input("Input value3 ")
    resultList.append([val1, val2, val3])

    response = input(print("Do you want to continue ? (Y/N) :  "))
    if response.upper() == "Y":
        continue
    else:
        break

print(resultList)

Результат:

Input value1 3                                                                                                                                  
Input value2 4                                                                                                                                  
Input value3 5                                                                                                                                  
Do you want to continue ? (Y/N) :                                                                                                               
Y                                                                                                                                           
Input value1 6                                                                                                                                  
Input value2 7                                                                                                                                  
Input value3 8                                                                                                                                  
Do you want to continue ? (Y/N) :                                                                                                               
N                                                                                                                                           
[['3', '4', '5'], ['6', '7', '8']]
1 голос
/ 01 ноября 2019

Я думаю, что код немного запутанный, вам нужно иметь «внутренний» список, который будет постепенно заполняться, и, как только он достигнет нужного вам размера, вы просто добавляете (копия -если вы хотите повторно использовать старый «внутренний список») весь внутренний список внутри «внешнего списка».

Один из способов сделать это (создать новый внутренний список на каждой итерации, потому что это более эффективно, чем копированиестарый и повторно использующий один и тот же объект) будет:

# we define upfront how many values we want in the inner list
NUM_INNER_VALUES = 3

# the outer list needs to be created outside the main loop
outer_list = []
# we set the control right in the `while`
response = 'Y'
while response.upper() == 'Y':
    # create a new `inner_list` and fill it in
    inner_list = []
    for i in range(NUM_INNER_VALUES):
        value = input(f"Input value {i + 1}: ")
        inner_list.append(value)
    outer_list.append(inner_list)
    # : optionally check the content of the outer list at each "row" iteration
    print('Outer list is currently: ')
    print(outer_list)
    response = input("Do you want to continue ? (Y/N) :  ")

Причина, по которой вы наблюдаете, что последний ввод повторяется, связана с тем, что вы определяете списки внецикл, и вы продолжаете использовать их память.

Это похоже на следующее:

a = [1, 2, 3]
b = a

print(a)
# [1, 2, 3]
print(b)
# [1, 2, 3]

b[0] = -1
print(a)
# [-1, 2, 3]

, как вы можете видеть, в то время как мы изменили b, значения a также изменилисьпотому что на самом деле a и b указывают на одну и ту же память.

Напротив, если вы принудительно выделите новую память для b, этого не произойдет:

a = [1, 2, 3]
b = a.copy()

print(a)
# [1, 2, 3]
print(b)
# [1, 2, 3]

b[0] = -1
print(a)
# [1, 2, 3]

РЕДАКТИРОВАТЬ

См. @ SamStafford's answer для минимального изменения, которое заставило бы ваш код работать. Обратите внимание, что один из list1 или list2 принципиально бесполезен.

1 голос
/ 01 ноября 2019

Вы хотите сделать копию list2, а не просто поместить оригинал в list3.

list3.append(list2.copy())
0 голосов
/ 01 ноября 2019

Еще один способ решения этой проблемы - использование функции для создания подсписка. Затем эта функция вызывается из основного цикла, который вы разработали. Это не только позволяет функции повторно использовать код генерации подсписка, но также создает локальное пространство имен, которое может использоваться на каждой итерации функции (т.е. каждый раз, когда она вызывается).

Также обратите внимание, что я использовал одно и то же имя переменной как для основного списка, так и для подсписков. Поскольку функции создают локальное пространство имен, которое используется с приоритетом перед глобальными именами, это не конфликт:

list1 = []

# function to create sub lists which reuses the code and provides local name space
def newList():
    list1 = []
    val1 = input("Input value1 ")
    list1.append(val1)
    val2 = input("Input value2 ")
    list1.append(val2)
    val3 = input("Input value ")
    list1.append(val3)   
    return list1

# main loop calling the function newList() to get input for sub lists 
while True:
    list1.append(newList())
    print(list1)
    response = input(print("Do you want to continue ? (Y/N):"))
    if response.upper() == "Y":
        continue
    else:
        break
0 голосов
/ 01 ноября 2019

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

concatenate делает то, что вы хотите, если у вас есть два массива и складывайте их для достижения желаемогоoutput

Обычно, когда вы хотите работать с числами, вы должны использовать массивы, я бы использовал списки только для текста.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...