python-关于字典与列表的一个作业

本文分享了两种将复杂字典转换为特定格式的方法。通过构造空字典并利用setdefault()方法,实现字典中数据的重组,适用于数据处理和信息整理场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目是这样的:
给定一个字典dict1,将其转换成dict2:
dict1 = {
    'fetal':[{u'key': u'sjzx_sy22_121.201.56.5', u'doc_count': 23}, {u'key': u'sjzx_sy21_121.201.56.4', u'doc_count': 4}],
    'warning':[{u'key': u'sjzx_sy22_121.201.56.5', u'doc_count': 30}, {u'key': u'sjzx_sy21_121.201.56.4', u'doc_count': 50}]
            }

dict2 = {'sjzx_sy22_121.201.56.5': [{'fetal': 23}, {'warning': 30}], 'sjzx_sy21_121.201.56.4': [{'fetal': 4}, {'warning': 50}]}
                

脑子摩擦了一个下午:

dict1 = {
    'fetal': [{u'key': u'sjzx_sy22_121.201.56.5', u'doc_count': 23},
              {u'key': u'sjzx_sy21_121.201.56.4', u'doc_count': 4}],
    'warning': [{u'key': u'sjzx_sy22_121.201.56.5', u'doc_count': 30},
                {u'key': u'sjzx_sy21_121.201.56.4', u'doc_count': 50}]
}


def getvalue(dictcome, key):
    retdict = {}
    for item in dictcome.get(key):  # 遍历传入字典的key为传入key值的对应value,item为{'key': 'sjzx_sy22_121.201.56.5', 'doc_count': 23}
        valuelist = list(item.values())  # 将item的value值保存为列表
                                        # ['sjzx_sy22_121.201.56.5', 23]//['sjzx_sy21_121.201.56.4', 4]
        retdict[valuelist[0]] = {key: valuelist[1]}  # 保存为dict2字典的格式,主要是提取dict2的key
    return retdict  # {'sjzx_sy22_121.201.56.5': {'fetal': 23}, 'sjzx_sy21_121.201.56.4': {'fetal': 4}}


def combindtwo(dicta, dictb):  # 合并两个字典,key值唯一,相同key对应的value保存为列表格式
    for i,j in dictb.items():
        if i in dicta.keys():
            listtmp = [dicta.get(i), j]
            dicta.update({f'{i}': listtmp})
        else:
            dicta.update({f'{i}': dictb[i]})
    return dicta

tmplist = []

for key in dict1.keys():
    tmplist.append(getvalue(dict1, key))  # 这里按dict1的key值调用getvalue参数,将dict1换一种格式输入
# 将获取到的字典保存在列表里,但是下面调用combindtwo函数时,我是直接用item取的。。。我觉得怪怪的。但不知道该如何做??

print('原字典为:')
print(dict1)
print('修改后的字典如下:')
print(combindtwo(tmplist[0], tmplist[1]))

最后输入结果为:(也算是达到目的了吧= =)

原字典为:
{'fetal': [{'key': 'sjzx_sy22_121.201.56.5', 'doc_count': 23}, {'key': 'sjzx_sy21_121.201.56.4', 'doc_count': 4}], 'warning': [{'key': 'sjzx_sy22_121.201.56.5', 'doc_count': 30}, {'key': 'sjzx_sy21_121.201.56.4', 'doc_count': 50}]}
修改后的字典如下:
{'sjzx_sy22_121.201.56.5': [{'fetal': 23}, {'warning': 30}], 'sjzx_sy21_121.201.56.4': [{'fetal': 4}, {'warning': 50}]}

 

然后看一下给我出题的大佬写的程序:

def get_ip_count(d):
    result = {}
    for key, values in d.items():
        for ip_result in values:
            # 以 IP 为键,设置值为默认空列表
            result.setdefault(ip_result['key'], [])
            # result[ip_result['key']] = []
            result_count = {}
            result_count[key] = ip_result['doc_count']
            result[ip_result['key']].append(result_count)
    return result


if __name__ == '__main__':
    d = {'fetal': [{u'key': u'sjzx_sy22_121.201.56.5', u'doc_count': 23},
                   {u'key': u'sjzx_sy21_121.201.56.4', u'doc_count': 4}],
         'warning': [{u'key': u'sjzx_sy22_121.201.56.5', u'doc_count': 30},
                     {u'key': u'sjzx_sy21_121.201.56.4', u'doc_count': 50}]
         }

    result = get_ip_count(d)
    print(result)

 大佬说:难点在于先构造空字典,构造出空字典之后,在下一个循环又不会被冲掉。

setdefault()方法:
dict.setdefault(key[,default=None])
  • key -- 字典中要查找的键。
  • default -- 可选参数,如果指定键的值不存在时,返回该值,默认为 None。
  • 返回指定键的值,如果指定键的值不在字典中返回指定值,默认为 None。

 

呵呵。

我要继续努力!

 

转载于:https://www.cnblogs.com/meudmed/p/10745871.html

### Python 字典集合的作业及练习题 以下是一些关于 Python 字典集合的练习题,涵盖了创建、访问、更新、删除元素以及数据处理等内容[^2]。 #### 1. 计算字典中值的总 编写一个函数,接受一个字典作为参数,返回字典中所有值的总。 ```python def sum_of_values(d): return sum(d.values()) # 示例 data = {"a": 10, "b": 20, "c": 30} print(sum_of_values(data)) # 输出:60 ``` #### 2. 合并两个字典 编写一个函数,将两个字典合并为一个字典。如果有相同的键,则保留第二个字典中的值。 ```python def merge_dicts(d1, d2): return {**d1, **d2} # 示例 d1 = {"a": 1, "b": 2} d2 = {"b": 3, "c": 4} print(merge_dicts(d1, d2)) # 输出:{'a': 1, 'b': 3, 'c': 4} ``` #### 3. 检查两个字典是否有相同的键 编写一个函数,检查两个字典是否具有相同的键。 ```python def has_same_keys(d1, d2): return set(d1.keys()) == set(d2.keys()) # 示例 d1 = {"a": 1, "b": 2} d2 = {"b": 3, "a": 4} print(has_same_keys(d1, d2)) # 输出:True ``` #### 4. 统计字符串中每个字符的出现次数 使用字典统计给定字符串中每个字符的出现次数。 ```python def char_count(s): count = {} for char in s: count[char] = count.get(char, 0) + 1 return count # 示例 print(char_count("hello")) # 输出:{'h': 1, 'e': 1, 'l': 2, 'o': 1} ``` #### 5. 求两个集合的差集 编写一个函数,求两个集合的差集(即第一个集合中不属于第二个集合的元素)。 ```python def set_difference(set1, set2): return set1 - set2 # 示例 set1 = {1, 2, 3, 4} set2 = {3, 4, 5, 6} print(set_difference(set1, set2)) # 输出:{1, 2} ``` #### 6. 判断集合是否是另一个集合的子集 编写一个函数,判断一个集合是否是另一个集合的子集。 ```python def is_subset(subset, superset): return subset.issubset(superset) # 示例 subset = {1, 2} superset = {1, 2, 3, 4} print(is_subset(subset, superset)) # 输出:True ``` #### 7. 将列表转换字典 将两个列表合并为一个字典,其中一个列表作为键,另一个列表作为值。 ```python def list_to_dict(keys, values): return dict(zip(keys, values)) # 示例 keys = ["a", "b", "c"] values = [1, 2, 3] print(list_to_dict(keys, values)) # 输出:{'a': 1, 'b': 2, 'c': 3} ``` #### 8. 删除字典中值小于指定值的键值对 编写一个函数,删除字典中值小于指定值的键值对。 ```python def remove_items_below_threshold(d, threshold): return {k: v for k, v in d.items() if v >= threshold} # 示例 data = {"a": 5, "b": 10, "c": 3} print(remove_items_below_threshold(data, 5)) # 输出:{'a': 5, 'b': 10} ``` #### 9. 计算两个集合的对称差 编写一个函数,计算两个集合的对称差(即只属于其中一个集合的元素)。 ```python def symmetric_difference(set1, set2): return set1 ^ set2 # 示例 set1 = {1, 2, 3} set2 = {3, 4, 5} print(symmetric_difference(set1, set2)) # 输出:{1, 2, 4, 5} ``` #### 10. 将字典中的键值互换位置 编写一个函数,将字典中的键值互换位置。 ```python def swap_keys_and_values(d): return {v: k for k, v in d.items()} # 示例 data = {"a": 1, "b": 2, "c": 3} print(swap_keys_and_values(data)) # 输出:{1: 'a', 2: 'b', 3: 'c'} ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值