在python中为列表创建一个increaseKey

时间:2011-10-11 13:23:56

标签: python dictionary adt

假设列表A包含字符串,偏移量为x

A=["a","b","c"]
x is int
len(A) is int

我需要序列化并返回json J,以便每个人都可以 n<len(A)
J[x+n]=a[n]

我目前使用dict分配,但感觉就像他们的高效 而不是遍历整个列表。

答案必须是O(1)或矛盾。

感谢。

dict={}

for i,x in enumerate(List):
    dict[i+offset]=x

4 个答案:

答案 0 :(得分:2)

如果您真的不想从列表中构造dict,则可以使用依赖于json模块的实现细节的hack:

class OffsetDict(dict):
    def __init__(self, lst, offset):
        self.lst = lst
        self.offset = offset
    def __nonzero__(self):
        return bool(self.lst)
    def iteritems(self):
        return enumerate(self.lst, self.offset)

A = ["a", "b", "c"]
d = OffsetDict(A, 5)
print json.dumps(d)

上面的代码打印

{"5": "a", "6": "b", "7": "c"}

因为构造OffsetDict实例不会迭代列表,所以这部分将是O(1)。当然,创建JSON输出不可避免地仍然是O(n)。

代码依赖于jsondict的每个子类视为dict而仅调用__nonzero__()iteritems()方法的事实。不要指望代码非常健壮。更强大的版本需要重新实现dict的所有方法。

在Python 3.x中,覆盖items()而不是iteritems()

答案 1 :(得分:1)

给出以下变量(不要使用dict / list作为变量名!):

offset = 5
A = ["a","b","c"]

您的示例代码可以写为:

d = dict(zip(range(offset, offset+len(A)), A))

或使用import itertools as it

d = dict(it.izip(it.count(offset), A))

或(Python 2.6及更新版):

d = dict(enumerate(A, offset))

在所有情况下,d现在都是{5: 'a', 6: 'b', 7: 'c'}。比较速度,第一个是最慢的,后两个没有显着差异。

答案 2 :(得分:0)

dict构造函数可以使用可迭代的键值对来构造dict。所以,你可以:

some_dictionary = dict((i + offset, x) for i, x in enumerate(some_list))

在较新的Pythons(2.7或3.x)中,dict理解有特殊的语法:

some_dictionary = {i + offset: x for i, x in enumerate(some_list)}

答案 3 :(得分:0)

为什么不将长度为offset的列表添加到A?

result = [None] * offset + A