Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在字典整数映射中查找独立整数间隔的pythonic方法_Python - Fatal编程技术网

在字典整数映射中查找独立整数间隔的pythonic方法

在字典整数映射中查找独立整数间隔的pythonic方法,python,Python,我有一个将一个整数范围映射到另一个整数范围的字典,例如: data = {0: 0, 1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 6, 8: 6, 9: 7, 10: 8} 我希望找到数值中的数值间隔未能增加的所有区域,因此我的输出应为: result = [[6, 8]] 对于上述输入 我想我的答案将涉及到所描述的分组itertools配方。出于我的目的,我尝试对其进行简单的实现,但我不确定如何将结果转换为我想要的结果: from operator imp

我有一个将一个整数范围映射到另一个整数范围的字典,例如:

data = {0: 0, 1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 6, 8: 6, 9: 7, 10: 8}
我希望找到数值中的数值间隔未能增加的所有区域,因此我的输出应为:

result = [[6, 8]]
对于上述输入

我想我的答案将涉及到所描述的分组itertools配方。出于我的目的,我尝试对其进行简单的实现,但我不确定如何将结果转换为我想要的结果:

from operator import itemgetter
from itertools import groupby
data = {0: 0, 1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 6, 8: 6, 9: 7, 10: 8}
for k, pos in groupby(enumerate(data.iteritems()), lambda (i, (a, s)):i - s):
    print map(itemgetter(1), pos)
具有以下输出:

[(0, 0), (1, 1), (2, 2), (3, 3), (4, 4), (5, 5), (6, 6)]
[(7, 6)]
[(8, 6), (9, 7), (10, 8)]
它正确地分组了我的输入数据,但并没有真正给出我想要的时间间隔。在将此输出解析为我想要的间隔时,我遇到的挑战是,它为“跳过区域”提供了一个间隔。

假设这些区域中的“非递增”值保持不变,并且也不递减,您可以只对具有相同值的项进行分组,然后选择具有多个项的组。最后,提取开始索引和结束索引

>>> data = {0: 0, 1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 6, 8: 6, 9: 7, 10: 8}
>>> items = sorted(data.items())
>>> groups = itertools.groupby(items, key=operator.itemgetter(1))
>>> ranges = [grp for grp in (list(grp) for key, grp in groups) if len(grp) > 1]
>>> ranges
[[(6, 6), (7, 6), (8, 6)]]
>>> [(r[0][0], r[-1][0]) for r in ranges]
[(6, 8)]
如果(a)您的键是连续整数,并且(b)您希望查找其值不大于前一个整数对应的值或不小于后一个整数对应的值的键,则:

>>> [k for k in sorted(data.keys()) if (k-1 in data and not data[k-1] < data[k]) or (k+1 in data and not data[k] < data[k+1])]
[6, 7, 8]
>>>[k表示排序中的k(data.keys())如果(k-1表示数据而非数据[k-1]
这里有一种使用的替代方法


这种方法的一个优点是,它不需要对字典进行排序。

这样的东西怎么样:

data = {0: 0, 1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 6, 8: 6, 9: 7, 10: 8}
sd = sorted(data.items())
result = []
for i in range(1, len(sd)):
    if sd[i][1] == sd[i-1][1]:
        result.append(i)
我认为
sorted(data.items())
比您的循环更清晰、更具Python风格

结果如下:

print result
[7, 8]

这可能是一个好的开始?

字典中每个索引都有一个条目吗?如果是这样,为什么不使用列表呢?如果不是:如何处理间隙?同样,当你说“无法增加”时,我们可以假设这些区域的值保持不变,还是它们也会减少?这些区域的值将保持不变,它们不会减少。当值单调增加时,键始终是一个从
(0,n)
的完整整数范围。这些数据可以很容易地存储为一个列表,而计算这些范围的另一个工具使用的是字典。没有理由不能转换。
print result
[7, 8]