сделайте нижнюю половину списка n * n нулевой без использования каких-либо функций в python

#python-3.x #list #matrix

#python-3.x #Список #матрица

Вопрос:

  1. Я попытался решить эту проблему , используя 2 цикла for и оператор if . Но я не смог получить желаемый результат.

ВВОД-

 1 1 1 1 1 1 1 1 1 1 
1 1 1 1 1 1 1 1 1 1 
1 1 1 1 1 1 1 1 1 1 
1 1 1 1 1 1 1 1 1 1 
1 1 1 1 1 1 1 1 1 1 
1 1 1 1 1 1 1 1 1 1 
1 1 1 1 1 1 1 1 1 1 
1 1 1 1 1 1 1 1 1 1 
1 1 1 1 1 1 1 1 1 1 
1 1 1 1 1 1 1 1 1 1
  
 thislist=[1]*10
thislist=[thislist]*10
print(thislist)
for i in range(10): 
    for j in range(10): 
        print(thislist[i][j], end = " ") 
    print() 
print()
for i in range(10):
    for j in range(10):
        if i>j:
            thislist[i][j]=0
for i in range(10): 
    for j in range(10): 
        print(thislist[i][j], end = " ") 
    print() 
  

Это был результат, который я получил:

 0 0 0 0 0 0 0 0 0 1 
0 0 0 0 0 0 0 0 0 1 
0 0 0 0 0 0 0 0 0 1 
0 0 0 0 0 0 0 0 0 1 
0 0 0 0 0 0 0 0 0 1 
0 0 0 0 0 0 0 0 0 1 
0 0 0 0 0 0 0 0 0 1 
0 0 0 0 0 0 0 0 0 1 
0 0 0 0 0 0 0 0 0 1 
0 0 0 0 0 0 0 0 0 1 
  
  1. но когда я составил список, используя приведенный ниже метод, я получил желаемый результат.
 thislist=[[1,1,1,1,1,1,1,1,1,1],
          [1,1,1,1,1,1,1,1,1,1],
          [1,1,1,1,1,1,1,1,1,1],
          [1,1,1,1,1,1,1,1,1,1],
          [1,1,1,1,1,1,1,1,1,1],
          [1,1,1,1,1,1,1,1,1,1],
          [1,1,1,1,1,1,1,1,1,1],
          [1,1,1,1,1,1,1,1,1,1],
          [1,1,1,1,1,1,1,1,1,1],
          [1,1,1,1,1,1,1,1,1,1]]
print(thislist)
for i in range(10):
    for j in range(10):
        if i>j:
            thislist[i][j]=0
for i in range(10): 
    for j in range(10): 
        print(thislist[i][j], end = " ") 
    print() 
  

примечание — Это желаемый РЕЗУЛЬТАТ-

 1 1 1 1 1 1 1 1 1 1 
0 1 1 1 1 1 1 1 1 1 
0 0 1 1 1 1 1 1 1 1 
0 0 0 1 1 1 1 1 1 1 
0 0 0 0 1 1 1 1 1 1 
0 0 0 0 0 1 1 1 1 1 
0 0 0 0 0 0 1 1 1 1 
0 0 0 0 0 0 0 1 1 1 
0 0 0 0 0 0 0 0 1 1 
0 0 0 0 0 0 0 0 0 1 
  

Кто-нибудь может объяснить, в чем разница между вышеуказанными 2 кодами?

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

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

2. хорошо — каков желаемый результат? что означает «нижняя половина n * n»?

Ответ №1:

Как вы указали, проблема возникает из-за того, как вы создали свой список list. В вашем первом примере вы делаете что-то вроде этого:

 list1 = [1]*10
list_of_list1=[list1]*10
  

list_of_list1 на самом деле это список мелких копий оригинала list1 . Затем, если вы измените значение в list_of_list1 , изменение произойдет во всех строках list_of_list1 .

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

В то же время, вы можете просто попробовать это.

 thislist = []
for row in range(10):
    list1 = [1]*10
    thislist.append(list1)
  

Но я обычно использую numpy, когда он доступен.