如何解决是否可以在defaultdict中调用迭代器来获取下一个键值?
Python 3.6.x
我有一个 defaultdict ,名为xref_to_records
。它有一个字符串作为键,并有一个列表作为值。
for k,v in xref_to_records.items():
print(type(k))
print(type(xref_to_records[k]))
break
它产生:
<class 'str'>
<class 'list'>
我想做的是遍历其项,以将键的值列表与下一个键的值列表进行比较。我知道这个问题可能已经在某个地方回答了,但是我无法确定是否可以使用任何提供的方法进行工作。
我试图遍历键的长度,但这是行不通的。
keys = xref_to_records.keys()
for i in range(len(keys)):
this_key = keys[i]
它引发了一个 TypeError :
TypeError:“ dict_keys”对象不支持索引
我也尝试过使用next()
遍历键,但是没有成功。
frick = None
for k,v in iter(xref_to_records.items()):
if k != frick:
res = next(k,None)
print(res)
break
再次出现 TypeError :
TypeError:“ str”对象不是迭代器
预期输出
for k,v in xref_to_records.items():
somefunctions(k)
somefunctions(next(k))
解决方法
严格来说,字典没有特定的顺序。但是,在从不使用Python的版本中,dict
中的项目应按照插入的原始顺序进行迭代,并且由于defaultdict
是dict
,the same should hold there,too的子类。
>>> from collections import defaultdict
>>> d = defaultdict(list)
>>> for i in range(4): d[i] = list(range(i+1))
>>> d[10] = []
>>> d[4] = []
>>> d
defaultdict(list,{0: [0],1: [0,1],2: [0,1,2],3: [0,2,3],4: [],10: []})
>>> list(d)
[0,3,10,4]
然后,您可以获取两个iter
的字典,使用next
将其中之一进行前进,然后zip
来获得(current,next)
个元素对。 (在这里,它只是一对密钥,但是当然您可以从字典中获取相应的值。)
>>> from itertools import tee
>>> it1,it2 = tee(iter(d))
>>> next(it2)
>>> for a,b in zip(it1,it2):
... print(a,b)
...
0 1
1 2
2 3
3 10
10 4
对于旧版本的Python,您可能不得不使用collections.OrderedDict
。相反,如果您不希望插入顺序,而是例如按字典顺序排序,您只需从iter
键中获取sorted
。
见下文
from collections import defaultdict
xref_to_records = defaultdict(list)
xref_to_records['A'].append(9)
xref_to_records['A'].append(12)
xref_to_records['B'].append(99)
xref_to_records['B'].append(112)
xref_to_records['C'].append(99.34)
xref_to_records['C'].append(112.88)
xref_to_records['C'].append(4112.88)
keys = list(xref_to_records.keys())
for idx,key in enumerate(keys):
if idx > 0:
print('compare:')
print('current:' + str(xref_to_records[key]))
print('previous: ' + str(xref_to_records[keys[idx-1]]))
print('')
输出
compare:
current:[99,112]
previous: [9,12]
compare:
current:[99.34,112.88,4112.88]
previous: [99,112]
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。