Почему я получаю сообщение об ошибке при попытке сравнить два списка?

Я пытаюсь сравнить два списка на линии #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(','))) бросить к списку обратно.

Другие вопросы по тегам