0

我遇到的问题出在函数arrangeNodes() 中。它似乎为我作为争论传递给它的 dict 添加了无关的值。dict 'stops' 是通过使用 'foo' 中特定范围内的值来填充的。我在下面展示了 foo 中任何时候的最大值为 3。由于该函数在 dict 中的键上迭代一次,因此每个键仅在第一个 for 循环和第二个 for 循环中使用一次,与键关联的集合最多只能包含 3 个值。

但是在函数执行后,我突然在 dict 的每个集合中有超过 3 个值

#!/usr/bin python
from collections import deque

d_min = int(raw_input())
d_max = int(raw_input())

def arrangeNodes(keys, stops):
    foo = deque()
    for r in keys:
        k = r + d_max
        while len(foo) and k < foo[0]: foo.popleft()
        for num in foo:
            if d_min <= num - r <= d_max: stops[r].add(num)
            else: break
        foo.append(r)
    return  


ans = 0
motels = {}.fromkeys([7000, 6010, 5990, 5030, 4970, 4060, 3930, 3060, 2940, 2030, 1970, 1010, 990, 0], set())
motels.update({}.fromkeys((int(raw_input()) for _ in xrange(int(raw_input()))), set()))
print motels #All sets in this dict are empty before the function call
arrangeNodes(sorted(motels.iterkeys(), reverse=True), motels)
for v in motels:
    print v, motels[v]

样本输入:970、1040、0

使用此输入,容器“foo”的最大长度不应超过 3。以下是函数中每次迭代的 foo 中的值:

deque([])
deque([7000])
deque([7000, 6010])
deque([6010, 5990])
deque([6010, 5990, 5030])
deque([5030, 4970])
deque([4970, 4060])
deque([4060, 3930])
deque([3930, 3060])
deque([3060, 2940])
deque([2940, 2030])
deque([2030, 1970])
deque([2030, 1970, 1010])
deque([1010, 990])

因此,dict 'motels' 包含的集合中的值不应超过 3 个。但是每当我运行这个程序时,当我在函数执行后打印 motel 时会得到以下输出:

0 set([5990, 5030, 2940, 4970, 1010, 2030, 1970, 3060, 7000, 6010, 4060, 3930, 990])
5990 set([5990, 5030, 2940, 4970, 1010, 2030, 1970, 3060, 7000, 6010, 4060, 3930, 990])
5030 set([5990, 5030, 2940, 4970, 1010, 2030, 1970, 3060, 7000, 6010, 4060, 3930, 990])
2940 set([5990, 5030, 2940, 4970, 1010, 2030, 1970, 3060, 7000, 6010, 4060, 3930, 990])
4970 set([5990, 5030, 2940, 4970, 1010, 2030, 1970, 3060, 7000, 6010, 4060, 3930, 990])
1010 set([5990, 5030, 2940, 4970, 1010, 2030, 1970, 3060, 7000, 6010, 4060, 3930, 990])
2030 set([5990, 5030, 2940, 4970, 1010, 2030, 1970, 3060, 7000, 6010, 4060, 3930, 990])
1970 set([5990, 5030, 2940, 4970, 1010, 2030, 1970, 3060, 7000, 6010, 4060, 3930, 990])
3060 set([5990, 5030, 2940, 4970, 1010, 2030, 1970, 3060, 7000, 6010, 4060, 3930, 990])
7000 set([5990, 5030, 2940, 4970, 1010, 2030, 1970, 3060, 7000, 6010, 4060, 3930, 990])
6010 set([5990, 5030, 2940, 4970, 1010, 2030, 1970, 3060, 7000, 6010, 4060, 3930, 990])
4060 set([5990, 5030, 2940, 4970, 1010, 2030, 1970, 3060, 7000, 6010, 4060, 3930, 990])
3930 set([5990, 5030, 2940, 4970, 1010, 2030, 1970, 3060, 7000, 6010, 4060, 3930, 990])
990 set([5990, 5030, 2940, 4970, 1010, 2030, 1970, 3060, 7000, 6010, 4060, 3930, 990])

我不明白为什么会这样。有人可以解释吗?

4

1 回答 1

2

我发现你的代码有点难以阅读,因为你想做什么并不完全清楚。但是,我假设您不希望 a dictwith itemsthat all 指向同一个set实例,之后就是这种情况

motels = {}.fromkeys([7000, 6010, 5990, 5030, 4970, 4060, 3930, 3060, 2940, 2030, 1970, 1010, 990, 0], set())

例如,如果您这样做:

>>> motels[7000].add(1)
>>> print motels[0]
    set([1])

因为所有的键都指向同一个项目。在使用用户提供的信息更新您的 dict 后,将会有另一个set实例,但是这与您的0. 试试这个

motels = dict([(i, set()) for i in [7000, 6010, 5990, 5030, 4970, 4060, 3930, 3060, 2940, 2030, 1970, 1010, 990, 0]])

初始化你的motels. 这将为每个键创建一个set实例。然后做

for i in xrange(int(raw_input())): motels[int(raw_input())] = set()

用于更新motels(我认为这也更具可读性)。

于 2013-08-15T21:24:02.017 回答