假设列表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
答案 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)。
代码依赖于json
将dict
的每个子类视为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