【问题标题】:Why am I receiving an error when trying to compare two lists?为什么我在尝试比较两个列表时收到错误消息?
【发布时间】:2017-01-17 15:39:42
【问题描述】:

我正在尝试比较#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()

【问题讨论】:

  • 该错误表示“您不能将列表放入集合中”。使用un.extend(a) 而不是un.append(a)。
  • 你不能做set([['1', '1', '1', '1']]),因为它是一个列表中的一个列表,所以试试x = set(rn[0]) & set(un[0])吧
  • @Rawing 辉煌!感谢您及时的回复。非常有帮助:)
  • @JackEvans 似乎也有效!谢谢:)

标签: python list python-3.x string-comparison list-comparison


【解决方案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()

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

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

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

【讨论】:

  • 太棒了。尽我所能理解它,但它非常困难。不过,感谢您提供了惊人的解决方案!
  • str.format() 用于通过用取自参数的值替换字段(在此示例中表示为 {})来构造字符串。
【解决方案2】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-14
    相关资源
    最近更新 更多