为什么我在尝试比较两个列表时收到错误消息?

Why am I receiving an error when trying to compare two lists?

我正在尝试比较两个列表 #12 和 return 找到的匹配项。

列表包含一个用户选择的号码 (un),其中一个是随机生成的 (rn)。

例如,[['1', '5', '3', '7']][['9', '6', '3', '2']] 会 return [3]

我是 python 的新手,正在使用找到的解决方案 HERE,但我的代码还没有成功。

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()

当您将列表来回转换为字符串时,结果将不是原始字符串。这将是一个包含原始字符串表示形式的字符的列表。

>>> a = [1, 2, 3]
>>> b = str(a)
>>> c = list(b)
>>> c
['[', '1', ',', ' ', '2', ',', ' ', '3', ']']

不要进行此类转换,如果必须这样做,请使用 ','.join(map(str, a)) 转换为字符串,然后使用 list(map(int, b.split(','))) 转换为列表。

与其使用列表来传递数据,不如使用函数参数。

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() 因为它所做的只是不必要地 fiddle 全局变量以使它们的值在函数 check().

中可访问

一种简化方法是将随机数和用户数保留为字符串。 set() 可以在字符串上调用而无需先将其转换为列表。如果您使用 set.intersection() 而不是 & 运算符,则只有一个字符串需要显式转换为一个集合。

我还冒昧地重命名了变量以符合 PEP8 style guide