如何过滤字典并将结果附加到列表中?

时间:2020-08-08 09:07:17

标签: python dictionary for-loop

class dataFilter:

构造函数

def __init__(self, data_dict):

    self.filtered_data = []
    self.data_dict = data_dict
    self.age_group = ""
    self.gender = ""
    self.period = ""
    self.migration_background = ""

def filteredData(self, age_group, gender, period, migration_background):

    self.age_group = age_group
    self.gender = gender
    self.period = period
    self.migration_background = migration_background

问题是这个if语句。由于某种原因,我找不到另一种方法:

    for key in self.data_dict["value"]:
        if key["Leeftijd"] == self.age_group and key["Geslacht"] == self.gender and key["Perioden"] == self.period and key["Migratieachtergrond"] == self.migration_background:
            self.filtered_data.append(key)
    return self.filtered_data

错误消息

如果key [“ Leeftijd”] == self.age_group和key [“ Geslacht”] == self.gender和key [“ Perioden”] == self.period和key [“ Migratieachtergrond”] == self。 migration_background: TypeError:字符串索引必须为整数

预期输入

age = "80007"
gender = "T001038"
period = "2000SJ00"
migrationbackground = "T001040"

预期的输出:返回列表后,它将立即打印到这样的屏幕上。

{'1198188', 'T001038', '80007', 'T001040', '2000SJ00'}, 
{'1198189', 'T001038', '80007', 'T001040', '2000SJ00'},
{'1198190', 'T001038', '80007', 'T001040', '2000SJ00'},
{'1198191', 'T001038', '80007', 'T001040', '2000SJ00'},
{'1198192', 'T001038', '80007', 'T001040', '2000SJ00'}

这是我使用的词典的一小部分。它真的很大,所以我没有包括全部内容,但这就是它的样子

{
  "value": {
    "288": {
      "ID": 288,
      "Geslacht": "T001038",
      "Leeftijd": "80007  ",
      "Migratieachtergrond": "T001040",
      "RegioS": "PV31  ",
      "Perioden": "2000SJ00",
      "Hbo_8": "       0"
    },
    "289": {
      "ID": 289,
      "Geslacht": "T001038",
      "Leeftijd": "80007  ",
      "Migratieachtergrond": "T001040",
      "RegioS": "PV31  ",
      "Perioden": "2001SJ00",
      "Hbo_8": "       0"
    },
    "290": {
      "ID": 290,
      "Geslacht": "T001038",
      "Leeftijd": "80007  ",
      "Migratieachtergrond": "T001040",
      "RegioS": "PV31  ",
      "Perioden": "2002SJ00",
      "Hbo_8": "       0"
    },
    "291": {
      "ID": 291,
      "Geslacht": "T001038",
      "Leeftijd": "80007  ",
      "Migratieachtergrond": "T001040",
      "RegioS": "PV31  ",
      "Perioden": "2003SJ00",
      "Hbo_8": "       0"
    },
    "292": {
      "ID": 292,
      "Geslacht": "T001038",
      "Leeftijd": "80007  ",
      "Migratieachtergrond": "T001040",
      "RegioS": "PV31  ",
      "Perioden": "2004SJ00",
      "Hbo_8": "       0"
    },
    "293": {
      "ID": 293,
      "Geslacht": "T001038",
      "Leeftijd": "80007  ",
      "Migratieachtergrond": "T001040",
      "RegioS": "PV31  ",
      "Perioden": "2005SJ00",
      "Hbo_8": "       0"
    }
  }
}

2 个答案:

答案 0 :(得分:0)

此错误的基本含义是,您在for循环中使用的键是字符串,并且您正在通过传递字典键来考虑将其视为字典,但是字符串具有整数索引 因此,请重新检查您的字典并相应地运行循环

答案 1 :(得分:0)

问题出在

for key in self.data_dict["value"]:
  # the type of key is `str` 

例如,

    print([key for key in self.data_dict["value"]])
    # It prints ['288', '289', '290', '291', '292', '293']

您可以改为执行以下操作

    for key, nested_obj in self.data_dict["value"].items():
        if (
            nested_obj["Leeftijd"] == self.age_group
            and nested_obj["Geslacht"] == self.gender
            and nested_obj["Perioden"] == self.period
            and nested_obj["Migratieachtergrond"] == self.migration_background
        ):
            self.filtered_data.append(key

不过,请注意,您输入的内容带有尾随空格(例如"80007 " != "80007")。您需要先清理空间。