微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

是否可以在defaultdict中调用迭代器来获取下一个键值?

如何解决是否可以在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中的项目应按照插入的原始顺序进行迭代,并且由于defaultdictdictthe 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 举报,一经查实,本站将立刻删除。