在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
我需要序列化并返回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及更新版本):
在所有情况下,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
”。