检查字符串是否在数组中。

3

我正在尝试检查一些字符串是否在一个数组中,就像这样:

intact_columns = [...]
for key, value in obj.iteritems():
    if not key in intact_columns:
       print key

问题是:数组中存在这样的项目:Reten\xc3\xa7\xc3\xa3o (RET)

而我要迭代的字符串是这样的:Retenção (RET)

如何解析数组中的字符串,使其看起来像普通字符串?

2
你尝试过这样写吗:if not key.encode('utf8') in intact_columns - Nf4r
2个回答

1
问题是因为两个字符串使用了不同的编码方式。我不确定编码类型。将它们解码为utf-8(或utf-16)是安全的,然后再进行检查。例如:
>>> my_list = ['Reten\xc3\xa7\xc3\xa3o (RET)', 'blah blah ...']
>>> my_string = 'Retenção (RET)'
>>> my_list[0].decode('utf-8')
u'Reten\xe7\xe3o (RET)'
>>> my_string.decode('utf-8')
u'Reten\xe7\xe3o (RET)'

两者具有相同的解码值


1
在我看来,这是一个很好的答案。;) - Joran Beasley

1

首先,您需要真正理解编码...猜测数组中的项目是utf8...您正在检查的项目似乎是unicode

if key.encode("utf8") in intact_columns:

请注意,我不知道正在使用的编码方式... (但utf8通常是一个相当安全的猜测)
有关编码的附注
bytestring.decode('utf8') # -> results in unicode
unicodestr.encode('utf8') # -> results in bytestring

在Python3中,除非是适当的类型(unicode / bytestring),否则您无法进行编码/解码。在Python2中,如果您将错误的内容传递给它,它会尝试隐式地为您编码或解码...这就是您遇到问题的地方。

'Retenção (RET)'.encode('utf-8') 会出现 UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 5: ordinal not in range(128) 错误。 - Moinuddin Quadri

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接