在我的代码中,我有以下内容:
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
答案 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'