为什么我在尝试比较两个列表时收到错误消息?
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。
我正在尝试比较两个列表 #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。