1

我正在尝试在线比较两个列表#12并返回找到的匹配项。

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

例如,[['1', '5', '3', '7']]并且[['9', '6', '3', '2']]会返回[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()
4

2 回答 2

1

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

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

不要做这样的转换,如果必须的话,使用','.join(map(str, a))to cast to string 和list(map(int, b.split(',')))to cast to list back。

于 2016-09-09T13:18:54.317 回答
1

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

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

这避免了访问函数内的全局变量,并且通常更具可读性。这样做我能够删除 function numsys(),因为它所做的只是不必要地摆弄全局变量,以使它们的值在 function 中可访问check()

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

我还冒昧地重命名了变量以符合PEP8 样式指南

于 2016-09-09T13:40:44.583 回答