我想查看列表中的元素,看看它们是否与字典相比无序。
我有以下代码:
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循环中的下一项而不会使列表超出范围错误。
答案 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