检查Python中的元素是否出错

时间:2015-01-10 10:36:08

标签: python list dictionary

我想查看列表中的元素,看看它们是否与字典相比无序。

我有以下代码:

list = ['jump','double blink']
dictionary = collections.OrderedDict([("wink", 1), ("double blink", 10), 
("close your eyes", 100), ("jump", 1000)])

如果我检查列表的元素,它应该返回False因为"跳转"在"双重闪烁后#34;在字典里。

起初,我以为我可以使用for循环来检查列表中操作的索引是否小于字典中下一个操作的索引。

这基本上是比较" jump"从键列表中的3,对应于列表中的下一个动作的字典中的索引(下一个项目是"双闪烁",其索引为1)。所以4< 1会返回false,但我不确定如何调用for循环中的下一项而不会使列表超出范围错误。

2 个答案:

答案 0 :(得分:1)

您可以使用zip()获取当前项目及其旁边的项目(不涉及索引,因此无需担心IndexError),然后使用生成器表达式all()做其余的事情:

>>> lst = ['jump','double blink']
>>> all(dictionary[f] < dictionary[s] for f, s in zip(lst, lst[1:]))
False
>>> lst = d.keys()
>>> all(dictionary[f] < dictionary[s] for f, s in zip(lst, lst[1:]))
True

此处zip()返回如下内容:

>>> zip(lst, lst[1:])
[('wink', 'double blink'), ('double blink', 'close your eyes'), ('close your eyes', 'jump')]

另一种选择是使用pairwise recipe from itertools's recipes,它使用迭代器完全相同:

>>> from itertools import tee, izip
>>> def pairwise(iterable):
        "s -> (s0,s1), (s1,s2), (s2, s3), ..."
        a, b = tee(iterable)
        next(b, None)
        return izip(a, b)
... 
>>> all(dictionary[f] < dictionary[s] for f, s in pairwise(lst))
True
>>> list(pairwise(lst))
[('wink', 'double blink'), ('double blink', 'close your eyes'), ('close your eyes', 'jump')]

答案 1 :(得分:1)

@Ashwini有正确的答案,但只是说如果值不是任何顺序,那么你可以做这样的事情。

>>> items = ['jump','double blink']
>>> dictionary = collections.OrderedDict([("wink", 400), ("double blink", 10),
("close your eyes", 300), ("jump", 0)])
>>> keys = iter(dictionary)
>>> all(item in keys for item in items)
False