首页 PaddleNLP 帖子详情
[疑问] paddlenlp.data.Dict 输入是无序的字典,而输出却是有序的列表 已解决
收藏
快速回复
PaddleNLP 问答数据 486 2
[疑问] paddlenlp.data.Dict 输入是无序的字典,而输出却是有序的列表 已解决
收藏
快速回复
PaddleNLP 问答数据 486 2

我看了它的代码,如下, 输入数据的每个字段处理结果result是直接放在列表ret里的,那么如何从返回结果里得到我想要的字段的处理结果呢?

    def __call__(self, data):
        ret = []
        for col_name, ele_fn in self._fn.items():
            result = ele_fn([ele[col_name] for ele in data])
            if isinstance(result, (tuple, list)):
                ret.extend(result)
            else:
                ret.append(result)
        return tuple(ret)

下面是测试代码, data1和data2都是字典列表,只是字段定义顺序不同

from paddlenlp.data import Stack, Pad, Dict

data1 = [
    {'labels': [1], 'token_ids': [1, 2, 3, 4]},
    {'labels': [0], 'token_ids': [5, 6, 7]},
    {'labels': [1], 'token_ids': [8, 9]},
]
data2 = [
    {'token_ids': [1, 2, 3, 4],'labels': [1]},
    {'token_ids': [5, 6, 7],'labels': [0]},
    {'token_ids': [8, 9],'labels': [1]},
]
batchify_fn = Dict({'token_ids': Pad(pad_val=0), 'labels': Stack()})
#%%

ret1= batchify_fn(data1)
ret2= batchify_fn(data2)

ret1和ret2结果如下

两个输出结果第0个元素对应token_ids , 第1个元素对应labels

也就是说输出结果里每个字段的结果并不是和输入数据中字段定义顺序相同, 那么如果

我用label ,token_ids  = batchify_fn(data1) 去拆分处理结果, 不就出错了吗

 

AIStudio9998716
已解决
2# 回复于2021-08
在python3.6+版本中python的dict是按照定义时候的顺序来遍历的
1
收藏
回复
全部评论(2)
时间顺序
AIStudio9998716
#2 回复于2021-08

在python3.6+版本中python的dict是按照定义时候的顺序来遍历的

1
回复
去你的萨芬
#3 回复于2021-08
在python3.6+版本中python的dict是按照定义时候的顺序来遍历的

原来如此! 涨知识了,感谢~

0
回复
需求/bug反馈?一键提issue告诉我们
发现bug?如果您知道修复办法,欢迎提pr直接参与建设飞桨~
在@后输入用户全名并按空格结束,可艾特全站任一用户