Python:识别长度为1与字符串的字符串列表

时间:2011-11-23 19:45:22

标签: python python-3.x

在我的代码中,我有以下内容:

if all(requiredField in submittedFields for requiredField in requiredFields):
    # all required fields in submittedFields exist
else:
    # error handling

目标是检查requiredFields中是否存在submittedFields中的字符串列表

requiredFields是长度为>的字符串列表时,此方法可以正常工作但是,当你有类似

之类的东西时
requiredFields = ('single element')

然后for循环迭代每个字符而不是字符串本身。

所以我的问题是,除了

之外,还有更多的pythonic方法来处理这个问题
try: 
    requiredFields.sort()
    # requiredFields is a list of strings
except AttributeError:
    # requiredFields is a string list whose length == 1

5 个答案:

答案 0 :(得分:6)

使用python集会更有效:

submitted_fields = set(['length', 'width', 'color', 'single element'])
required_fields = set(['width', 'length'])
if submitted_fields >= required_fields:
    # all required fields in submittedFields exist
else:
    # error handling

一些优化使得速度更快:

  • 集合的哈希表实现确保在通过字符相等性测试执行字符之前匹配的可能性很高。
  • 如果两个字符串相同(内存中的同一个对象),则身份检查将绕过逐个字符的相等检查。

请注意。看起来你的原始问题是元组符号。 Steven Rumbalski非常好地解决了这个问题。当然,如果你使用套装,这就成了一个问题。

祝你的实地验证: - )

答案 1 :(得分:5)

括在括号中的字符串不是元组 - 它是一个字符串。要创建一个项目元组,您需要一个尾随逗号:

>>> ('single element') # this is not a tuple, it's a string
'single element'
>>> ('single element',) # note the trailing comma
('single element',)

有关详细信息,请参阅Tuple Syntax堆栈溢出问题Python tuple comma syntax rule上的wiki。

答案 2 :(得分:0)

这是因为定义

requiredFields = ('single element')

实际上相当于

requiredFields = 'single element'

要制作单个元素列表,请执行

requiredFields = ['single element']

要制作单个元素元组,请执行

requiredFields = ('single element',)

答案 3 :(得分:0)

首先你永远不应该requiredFields = ('single element') - 如果你想要一个元组,你应该写requiredFields = ('single element',)

但假设您无法控制输入,最常用的测试方法是:

if isinstance(requiredFields, basestring):
    # requiredFields is a string
else:
    # requiredFields is iterable

答案 4 :(得分:0)

为什么不做这样的事情:

required = ['name', 'password']
submitted = ['name', 'email']

for field in required:
    if field not in submitted:
        print field + ' is required'