在python中为列表创建一个increaseKey

在python中为列表创建一个increaseKey,python,dictionary,adt,Python,Dictionary,Adt,假设一个包含字符串的列表a,以及一个偏移量x A=[“A”、“b”、“c”] x为int len(A)为int 我需要序列化并返回jsonJ,以便 n给定以下变量(不要使用dict/list作为变量名!): 您的示例代码可以编写为: d = dict(zip(range(offset, offset+len(A)), A)) 或者使用导入itertools作为导入工具: d = dict(it.izip(it.count(offset), A)) 或(Python 2.6及更新版本): 在所

假设一个包含字符串的列表
a
,以及一个偏移量
x

A=[“A”、“b”、“c”]

x为int

len(A)为int

我需要序列化并返回json
J
,以便
n给定以下变量(不要使用dict/list作为变量名!):

您的示例代码可以编写为:

d = dict(zip(range(offset, offset+len(A)), A))
或者使用
导入itertools作为导入工具

d = dict(it.izip(it.count(offset), A))
或(Python 2.6及更新版本):

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

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

您的示例代码可以编写为:

d = dict(zip(range(offset, offset+len(A)), A))
或者使用
导入itertools作为导入工具

d = dict(it.izip(it.count(offset), A))
或(Python 2.6及更新版本):


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

dict
构造函数可以使用一组键值对来构造dict。因此,您可以:

some_dictionary = dict((i + offset, x) for i, x in enumerate(some_list))
在较新的python(2.7或3.x)中,dict理解有特殊的语法:

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

dict
构造函数可以获取一组键值对来构造dict。因此,您可以:

some_dictionary = dict((i + offset, x) for i, x in enumerate(some_list))
在较新的python(2.7或3.x)中,dict理解有特殊的语法:

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

如果您确实不想从列表中构造一个
dict
,您可以使用一个hack,它取决于
json
模块的实现细节:

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
,并且只调用
\uu非零方法()
iteritems()
方法。不要期望代码非常健壮。一个更健壮的版本需要重新实现dict的所有方法


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

如果您确实不想从列表中构造
dict
,您可以使用一种取决于
json
模块的实现细节的破解方法:

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
,并且只调用
\uu非零方法()
iteritems()
方法。不要期望代码非常健壮。一个更健壮的版本需要重新实现dict的所有方法


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

为什么不将长度
偏移量
的列表前置到一个值

result = [None] * offset + A

为什么不将长度
偏移量
列表预先添加到a

result = [None] * offset + A

你能用dict赋值给我们看看你的代码吗?@eumiro这是简单的遍历。你的变量命名与一些课程无关;不要隐藏内置代码(比如使用
dict={}
),阅读标准变量命名的内容和更多有用的内容。答案需要是O(1)-我担心这是不可能的。字典构建至少是O(n)。@shevski:很好,但在你的问题中也要养成使用有用名称的习惯。你能用dict赋值给我们看看你的代码吗?@eumiro这是简单的遍历。你的变量命名与一些课程无关;不要隐藏内置代码(比如使用
dict={}
),阅读标准变量命名的内容和更多有用的内容。答案需要是O(1)-我担心这是不可能的。词典构建至少是O(n)。@shevski:好,但在你的问题中也要养成使用有用名称的习惯。插入该名称需要O(偏移量),从列表中创建一个dict至少是O(len(a))。唯一可以得到O(1)的方法是修改JSON客户机以获取索引(x-offset)处的项:-)插入该项需要O(offset),并且从列表创建dict至少需要O(len(a))。你能得到O(1)的唯一方法是修改你的JSON客户机以获取索引(x-偏移量)处的项目:-)不知道我可以包装
dict
@shevski:请理解上面的类从
dict
派生的唯一原因是欺骗
JSON
模块将这个类的实例视为
dict
。它实际上不是一个“包装的
dict
”。我不知道我可以包装
dict
@shevski:请理解,上面的类从
dict
派生的唯一原因是欺骗
json
模块将此类的实例视为
dict
。它实际上不是一个“包装的
dict
”。