使用python在列表中为同一键添加乘法值

时间:2019-02-25 07:56:31

标签: python json

请检查以下代码和我的输出。我已经运行了我的代码,但得到了以下输出,但我希望得到预期的结果。

list_data = ['ABCD:SATARA', 'XYZ:MUMBAI', 'PQR:43566', 'LMN:455667', 'XYZ:PUNE']

预期结果是:-

{
  "ABCD": "SATARA",
  "XYZ": ["MUMBAI", "PUNE"]
  "PQR": "43566",
  "LMN": "455667"
}

我的代码:-

list_data = ['ABCD:SATARA', 'XYZ:MUMBAI', 'PQR:43566', 'LMN:455667', 'XYZ:PUNE']

    for each_split_data in list_data:
        split_by_colon = each_split_data.split(":")
        if split_by_colon[0] is not '':
            if split_by_colon[0] in splittded_data_dict:
                # append the new number to the existing array at this slot
                splittded_data_dict[split_by_colon[0]].append(split_by_colon[1])
            else:
                # create a new array in this slot
                splittded_data_dict[split_by_colon[0]] = [split_by_colon[1]]

    print(json.dumps(splittded_data_dict, indent=2), "\n")

我的输出:-

{
  "ABCD": [
    "SATARA"
  ],
    "REF": [
    "MUMBAI.",
    "PUNE"
  ],
  "PQR": [
    "43566"
  ],
  "LMN": [
    "455667"
  ]
}

我该如何解决以上问题?

4 个答案:

答案 0 :(得分:1)

我认为最好的做法是使用defaultdict from the collections module。看看:

from collections import defaultdict


list_data = ['ABCD:SATARA', 'XYZ:MUMBAI', 'PQR:43566', 'LMN:455667', 'XYZ:PUNE']

res = defaultdict(list)
for item in list_data:
    key, value = item.split(':')
    res[key].append(value)

结果为:

print(res)
# defaultdict(<class 'list'>, {'ABCD': ['SATARA'], 'XYZ': ['MUMBAI', 'PUNE'], 'PQR': ['43566'], 'LMN': ['455667']})

或将其转换为字典以获得更熟悉的输出:

res = dict(res)
print(res)
# {'ABCD': ['SATARA'], 'XYZ': ['MUMBAI', 'PUNE'], 'PQR': ['43566'], 'LMN': ['455667']}

答案 1 :(得分:1)

根据我对问题陈述的描述所了解的,您希望splittded_data_dict是一个字典,其中每个值都是一个列表 为此,请尝试使用defaultdict().,请参见下面的示例。

from collections import defaultdict

splittded_data_dict = defaultdict(list)
splittded_data_dict['existing key'].append('New value')

print(splittded_data_dict)

答案 2 :(得分:0)

您可以使用isinstance函数来检查密钥是否已转换为列表:

d = {}
for i in list_data:
    k, v = i.split(':', 1)
    if k in d:
        if not isinstance(d[k], list):
            d[k] = [d[k]]
        d[k].append(v)
    else:
        d[k] = v

d变为:

{'ABCD': 'SATARA', 'XYZ': ['MUMBAI', 'PUNE'], 'PQR': '43566', 'LMN': '455667'}

答案 3 :(得分:0)

让我们在list_data的字符串项中附加所有可能的键值。获取唯一项列表。现在循环遍历list_data并检查“:”拆分字符串的第一项是否与列表a匹配,并且是否将匹配项追加到临时列表,最后将该临时列表指定为值列表a中项目的键。

这是同时使用dict理解和list理解的一个班轮

   c = {i : [j.split(":")[1] for j in list_data if j.split(":")[0] == i ][0] if len([j.split(":")[1] for j in list_data if j.split(":")[0] == i ])==1 else [j.split(":")[1] for j in list_data if j.split(":")[0] == i ] for i in list(set([i.split(":")[0] for i in list_data]))}

输出应为:

# c = {'LMN': '455667', 'ABCD': 'SATARA', 'PQR': '43566', 'XYZ': ['MUMBAI', 'PUNE']}

以下是该代码的详细版本:

list_data = ['ABCD:SATARA', 'XYZ:MUMBAI', 'PQR:43566', 'LMN:455667', 'XYZ:PUNE']
a = []
for i in list_data:
    a.append(i.split(":")[0])
a = list(set(a))
b = {}
for i in a:
    temp = []
    for j in list_data:
        if j.split(":")[0] == i:
            temp.append(j.split(":")[1])
    if len(temp) > 1:
        b[i] = temp
    else:
        b[i] = temp[0]