Python字符串比较不起作用

时间:2013-10-15 17:59:10

标签: python arrays string python-2.7 string-comparison

所以我在python中有以下代码块,它基本上打开一个文本文件,从文件的文本内容中生成一个数组(逐行拆分),然后继续从用户那里获取输入并将该输入与数组中的每个术语。尽管用户提交的字符串在数组中,与输入的完全相同,但程序无法判断两个字符串是否相等。我如何比较字符串?如果这种表示法是正确的,那可能是造成不平等的原因?我尝试用“is”代替“==”,但这也不起作用。

userinput的输入为frogeyedpeasUserArray[0]的输入为frogeyedpeas

文件Usernames.txt

frogeyedpeas
vsauce

(vsauce之后还有一行完全空白)

以下代码:

Usernames = open('Usernames.txt', 'r+')
UserArray = Usernames.read().split("\n")

userinput = raw_input("Enter Username: ")
passinput = raw_input("Enter Password: ")
i = 0
q = len(UserArray)
while(i < q):
    founduser = 0
    print userinput, UserArray[i], UserArray #out

    if(UserArray[i] == userinput):
        founduser = 1
        if(PassArray[i] == passinput):
            userstatus = i
            founduser = 2
    i = i + 1

5 个答案:

答案 0 :(得分:3)

您正在测试对象标识:

UserArray[i] is userinput:

你真的想要使用 equality

UserArray[i] == userinput:

is测试两个对象引用是否指向同一个对象。 ==测试两个对象的值是否相等。

具有相同内容(相同)的两个字符串不一定是同一个对象:

>>> spam = 'foo bar baz'
>>> ham = 'foo bar baz'
>>> spam is ham
False
>>> spam == ham
True
>>> eggs = ham
>>> eggs is ham
True

CPython确实使用一些技巧来节省内存并提高性能,其中小整数和一些字符串 interned ;每次尝试创建一个新的字符串或整数,而不是一个新对象,您将获得一个已缓存的值。在这些情况下,is测试仅返回True ,因为您确实拥有相同的对象,并由解释器重复使用。

请注意,相等测试仍可能不正确。值可能会有额外的空格,或者在打印到屏幕时不会立即明显的其他字符:

>>> val1 = 'frogeyedpeas'
>>> val2 = 'frogeyedpeas\t'
>>> val1 == val2
False
>>> print val1, val2
frogeyedpeas frogeyedpeas
>>> print repr(val1), repr(val2)
'frogeyedpeas' 'frogeyedpeas\t'

答案 1 :(得分:3)

尝试:

UserArray[i].strip(' \n') == userinput.strip(' \n')

由于您的输入方法不同,您可能在一个而不是另一个中有尾随空格和/或换行符。

答案 2 :(得分:1)

好吧,如果finduser等于1,你是否试图突破循环以测试它是否有效?每次代码都在while循环中运行代码时发现用户重置。也许说while(i&lt; q和founduser!= 1)作为循环标题?

答案 3 :(得分:1)

这应该足够了:

#What to look for.
x=raw_input("Test for: ")

#Read and split list.
f=open('usernames.txt','r')
y=f.read()
y=y.split(',')
f.close()

#Test if the input is in list.
#If it is, tell what the match is.
for user in y:
    if str(x)==str(user):
        print x+'='+user

'username.txt'的格式如下:

Vsauce的,frogeyedpeas

让我知道它是怎么回事。

答案 4 :(得分:1)

复制代码后,使用“frogeyedpeas”创建一个新文本文件,并使用==代替is,代码似乎确实有效。要清理它,你可能想要使用for循环并将两个数组压缩在一起,如下所示:

for name, password in zip(UserArray, PassArray):
    print userinput, name, UserArray        

    if name == userinput:
        founduser = 1

    if password == passinput:
        userstatus = UserArray.index(name)
        founduser = 2