使用 zip 函数处理字典,在 Python 中保持相同的结构

Processing dictionary with zip function keeping the same structure in Python

我有一个字典,其中每个键都映射到一个数组列表,除了键“reference”,它只是一个整数数组。

cls["input_ids"], cls["attention_masks"], cls["标签"], cls["参考"]

一个键的每一行都链接到其他键的行(这是 Bert 分词器的修改输出)

我想通过参考值过滤掉一些行并在输出中保持相同的字典结构,现在我设法做到这一点的唯一方法是这样的: 我放了一些随机数据来给出一个想法


cls= {"input_ids":[[22,22,22],[33,33,33]], "attention_masks":[[22,22,22],[33,33,33]], "reference":[1,0], "labels":[[[22,22,22],[33,33,33]]]}
mcp = {"input_ids":[], "attention_masks":[], "reference":[], "labels":[]}

        for el in zip(cls["input_ids"], cls["attention_masks"], cls["reference"], cls["labels"]):
            if el[2] == 1:
                mcp["input_ids"].append(el[0])
                mcp["attention_masks"].append(el[1])
                mcp["reference"].append(el[2])
                mcp["labels"].append(el[3])

但我真的不喜欢这段代码,我想知道是否有更漂亮的方法。

假设你的值都具有相同的长度,我建议使用 pandas 来进行这种修改。

import pandas as pd

cls= {"input_ids":[[22,22,22],[33,33,33]], 
      "attention_masks":[[22,22,22],[33,33,33]], 
      "reference":[1,0], 
      "labels":[[22,22,22],[33,33,33]] # I assume this is what you meant
      }

# Turn the data into a dataframe which is sth like a table
df = pd.DataFrame(cls)

这就是 df 的样子:

>>> df
      input_ids attention_masks  reference        labels
0  [22, 22, 22]    [22, 22, 22]          1  [22, 22, 22]
1  [33, 33, 33]    [33, 33, 33]          0  [33, 33, 33]

您可以访问 df['reference'] 等值并过滤数据,例如:

>>> df[df['reference']==1]
      input_ids attention_masks  reference        labels
0  [22, 22, 22]    [22, 22, 22]          1  [22, 22, 22]

如果你需要它作为字典:

>>> df[df['reference']==1].to_dict()
{'input_ids': {0: [22, 22, 22]},
 'attention_masks': {0: [22, 22, 22]},
 'reference': {0: 1},
 'labels': {0: [22, 22, 22]}}