如何检查一个字典列表是否已排序?

4

我已经创建了一个字典列表:

l = []
d = {"a":1,"b",2}
l.append(d)
d = {"a":5,"b":6}
l.append(d)
d = {"a":3,"b":4}
l.append(d)

现在,我该如何检查字典列表是否按照键 a 或键 b 排序?


1
你能解释一下按照你的定义,什么是一个“排序”的字典列表吗?我认为这并不是一个明确定义的属性。 - 5gon12eder
3个回答

3
print(l == sorted(l, key=lambda d:d["a"]))
False

这个算法的时间复杂度最好是O(n log n),而我的答案在最好情况下是O(1),最坏情况下是O(n)。 - orlp
是的,这只是一种直观的解决方案。当性能很重要时,人们总是可以尝试像你的那样更优化的东西。 - Dyno Fu

2

如果要检查是否已排序,请使用默认检查,但在比较之前先进行索引:

k = "a"
all(l[i][k] <= l[i+1][k] for i in range(len(l) - 1))

1

这个答案所述,您可以使用以下方法高效地检查列表是否已排序:

all(l[i] <= l[i+1] for i in xrange(len(l)-1))

为了支持自定义键,您可以定义类似以下的内容。
def is_sorted(iterable, key=None):
    if key is None:
        key = lambda x : x
    return all(key(iterable[i]) <= key(iterable[i+1]) for i in xrange(len(iterable)-1))

在这种情况下,您可以使用一个简单的lambda函数作为键查找字典值(假设所有元素都是包含ab的字典),例如:
# Check if list of dictionaries are sorted by value of 'a'
>>> is_sorted(l, key=lambda x: x["a"])

# Check if list of dictionaries are sorted by value of 'b'
>>> is_sorted(l, key=lambda x: x["b"])

# Check if list of dictionaries are sorted by value of 'a', then 'b'
>>> is_sorted(l, key=lambda x: (x["a"], x["b"]))

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