Почему я получаю сообщение об ошибке при попытке сравнить два списка?
Я пытаюсь сравнить два списка на линии #12
и найти найденные совпадения.
Списки содержат один выбранный пользователем номер (un
) и один из которых был сгенерирован случайным образом (rn
).
Например, [['1', '5', '3', '7']]
а также [['9', '6', '3', '2']]
вернется [3]
,
Я довольно новичок в python и использую решение, найденное ЗДЕСЬ, но пока не добился успеха с моим кодом.
import random
import re
rn = []
un = []
Numbers = range(1000,9999)
RandomNumber = random.choice(Numbers)
RandomNumber = str(RandomNumber)
def check():
x = set(rn) & set(un) #12
print (x)
def numsys():
b = list(RandomNumber)
rn.append(b)
print(rn)
print(un)
check()
def numval():
while True:
UserNum = (input("Please enter a 4 digit number: "))
if re.match("^[0-9]{4,4}$", UserNum):
a = list(UserNum)
un.append(a)
numsys()
break
numval()
2 ответа
Вместо использования списков для передачи данных используйте параметры функции.
import random
import re
def check(random_number, user_number):
print('random_number {}, user_number {}'.format(random_number, user_number))
x = set(random_number).intersection(user_number)
print(x)
def numval():
random_num = str(random.choice(range(1000, 9999)))
while True:
user_num = (input("Please enter a 4 digit number: "))
if re.match("^[0-9]{4,4}$", user_num):
check(random_num, user_num)
break
numval()
Это позволяет избежать доступа к глобальным переменным внутри функций и, как правило, более читабельно. Делая это, я смог удалить функцию numsys()
потому что все, что он делал, было излишне возиться с глобальными переменными, чтобы сделать их значения доступными в функции check()
,
Одним из упрощений было сохранение случайных и пользовательских номеров в виде строк. set()
может вызываться для строки, не требуя, чтобы она была сначала преобразована в список. И только одна из строк должна быть явно преобразована в набор, если вы используете set.intersection()
вместо &
оператор.
Я также позволил себе переименовать переменные в соответствии с руководством по стилю PEP8.
Когда вы приводите список к строке вперед и назад, результатом не будет исходная строка. Это был бы список, содержащий символы представления исходной строки.
>>> a = [1, 2, 3]
>>> b = str(a)
>>> c = list(b)
>>> c
['[', '1', ',', ' ', '2', ',', ' ', '3', ']']
Не делайте таких кастингов, а если нужно, используйте ','.join(map(str, a))
бросить в строку, и list(map(int, b.split(',')))
бросить к списку обратно.