Уведомления

Группа в Telegram: @pythonsu

#1 Июль 12, 2022 09:56:41

Andruid
Зарегистрирован: 2022-07-12
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

Проблем в выводе результата при разном создании одинакового списка

При создании списка вот таким deck =

[[''] * 9]*4
вариантом, результирующий список полностью заполнен последним значением списка suits - ‘ of clubs’, если создать список вручную, выводит все нормально, в чем проблема, что сделал не так, выводил пустые списки deck и deck_1 - они полностью идентичны
 suits = [' of hearts', ' of spades', ' of diamonds', ' of clubs']
card_val = ['6', '7', '8', '9', '10', 'Jack', 'Queen', 'King', 'Ace']
deck = [[''] * 9]*4
deck_1 = [['','','','','','','','','',],
        ['','','','','','','','','',],
        ['','','','','','','','','',],
        ['','','','','','','','','',]]
for x in range(len(deck)):    
    for y in range(len(card_val)):                        
        deck[x][y] = card_val[y] + suits[x]               
print (deck)
print ('--------------------')
print (deck_1)

Результат

Отредактировано FishHook (Июль 12, 2022 10:30:20)

Офлайн

#2 Июль 12, 2022 10:33:12

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Проблем в выводе результата при разном создании одинакового списка

Andruid
список - изменяемый объект (погуглите “питон изменяемые и неизменяемые”), это значит, что он всегда передается по ссылке, то есть вот тут

 [[''] * 9]*4
вы создали не список из четырех списков, а список из четырех ссылок на один и тот же список



Офлайн

#3 Июль 12, 2022 10:40:56

Andruid
Зарегистрирован: 2022-07-12
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

Проблем в выводе результата при разном создании одинакового списка

FishHook
вы создали не список из четырех списков, а список из четырех ссылок на один и тот же список
Понятно, а как тогда создать кратко вот такую “болванку” для списка? Если мне нужно будет не 4 на 9, а больше, я замучаюсь эти скобки и кавычки рисовать. Можно как то эту запись deck = [ * 9]*4 сделать, чтобы она работала после создания, как 4 разных списка, а не ссылка на один и тот же?

Офлайн

#4 Июль 12, 2022 11:26:31

Palrom
Зарегистрирован: 2022-04-21
Сообщения: 82
Репутация: +  5  -
Профиль   Отправить e-mail  

Проблем в выводе результата при разном создании одинакового списка

  
deck = [[] for i in range(4)]
 
for x in range(len(deck)):
    for y in range(len(card_val)):
        deck[x].append(card_val[y] + suits[x])

При использовании метода append() и так пойдёт:
 deck_1 = [[], [], [], []]

Отредактировано Palrom (Июль 12, 2022 11:29:32)

Офлайн

#5 Июль 12, 2022 11:41:44

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Проблем в выводе результата при разном создании одинакового списка

Andruid
я замучаюсь эти скобки и кавычки рисовать
 deck = [[''] * 9 for _ in range(4)]



Офлайн

#6 Июль 12, 2022 11:44:57

xam1816
Зарегистрирован: 2020-05-11
Сообщения: 1395
Репутация: +  124  -
Профиль   Отправить e-mail  

Проблем в выводе результата при разном создании одинакового списка

  
suits = [' of hearts', ' of spades', ' of diamonds', ' of clubs']
card_val = ['6', '7', '8', '9', '10', 'Jack', 'Queen', 'King', 'Ace']
deck = [f"{v}_{s}" for v in card_val for s in suits]
print(deck)

 
['6_ of hearts', '6_ of spades', '6_ of diamonds', '6_ of clubs', '7_ of hearts', '7_ of spades', '7_ of diamonds', '7_ of clubs', '8_ of hearts', '8_ of spades', '8_ of diamonds', '8_ of clubs', '9_ of hearts', '9_ of spades', '9_ of diamonds', '9_ of clubs', '10_ of hearts', '10_ of spades', '10_ of diamonds', '10_ of clubs', 'Jack_ of hearts', 'Jack_ of spades', 'Jack_ of diamonds', 'Jack_ of clubs', 'Queen_ of hearts', 'Queen_ of spades', 'Queen_ of diamonds', 'Queen_ of clubs', 'King_ of hearts', 'King_ of spades', 'King_ of diamonds', 'King_ of clubs', 'Ace_ of hearts', 'Ace_ of spades', 'Ace_ of diamonds', 'Ace_ of clubs']

Офлайн

#7 Июль 12, 2022 12:10:18

ZerG
Зарегистрирован: 2012-04-05
Сообщения: 2627
Репутация: +  61  -
Профиль   Отправить e-mail  

Проблем в выводе результата при разном создании одинакового списка

В питоне не нужно создавать массив определенной длины перед тем как его заполнить по аналогии
с Си и другими языками (кроме отдельных случаев и то там будет кортеж скорее всего)

 suits = [" of hearts", " of spades", " of diamonds", " of clubs"]
card_val = ["6", "7", "8", "9", "10", "Jack", "Queen", "King", "Ace"]
deck = []
for cs in suits:
    deck.append([val+cs for val in card_val])
print(deck)



Влодение рускай арфаграфией - это как владение кунг-фу: настаящие мастира не преминяют ево бес ниабхадимости

Офлайн

#8 Июль 12, 2022 12:11:52

ZerG
Зарегистрирован: 2012-04-05
Сообщения: 2627
Репутация: +  61  -
Профиль   Отправить e-mail  

Проблем в выводе результата при разном создании одинакового списка

xam1816
Опередил. Только подчеркивание лишнее…



Влодение рускай арфаграфией - это как владение кунг-фу: настаящие мастира не преминяют ево бес ниабхадимости

Офлайн

#9 Июль 12, 2022 20:21:12

Andruid
Зарегистрирован: 2022-07-12
Сообщения: 3
Репутация: +  0  -
Профиль   Отправить e-mail  

Проблем в выводе результата при разном создании одинакового списка

Спасибо всем за ответы.
Можно ли сделать сделать методом без предопределения списка (таким как

  deck = [f"{v}_{s}" for v in card_val for s in suits] 
или таким как
  deck.append([val+cs for val in card_val])) 
вложенный список? Такими способами список получается одномерным, хотелось бы разделить масти карт в 4 списка и вложить их в список.

Отредактировано Andruid (Июль 12, 2022 20:42:33)

Офлайн

#10 Июль 12, 2022 22:48:50

ZerG
Зарегистрирован: 2012-04-05
Сообщения: 2627
Репутация: +  61  -
Профиль   Отправить e-mail  

Проблем в выводе результата при разном создании одинакового списка

можно - зачем ваш наш форум?



Влодение рускай арфаграфией - это как владение кунг-фу: настаящие мастира не преминяют ево бес ниабхадимости

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version