【问题标题】:How to find group of key pair in python如何在python中找到一组密钥对
【发布时间】:2021-07-27 15:45:51
【问题描述】:

我有字典:

resultDict = {"aaa10" : 10, "eee343", 88 ,"aaa15" : 40,"bbb60" : 10,"aaa13" : 80,"bbb60" : 10,"aaa30" : 50,"ccc99" : 100, "aaa56" : 10,"ccc67" : 10,"aaa78" : 40, "ddd78" :88 , "eee343" : 88 }

我想通过 dict 键自定义分组,前 3 个字母固定为模式。

愿望输出:

Group,1            # For Group-1 include eee* and ccc* pattern with value and so on
 eee343, 88
 eee100, 10
 ...
 ccc*, <value>
Group,2
 bbb* <value>
Group,3
 ddd* <value>
 aaa*, <value>

我的代码:

print("Group","1")
for key,value in resultDict.items():
  if re.findall ("eee", key) or ("ccc", key):
     print(key,value)

print("Group","2")
for key,value in resultDict.items():
  if re.findall ("bbb", key):
     print(key,value)

print("Group","3")
for key,value in resultDict.items():
  if re.findall ("ddd", key) or ("aaa", key):
     print(key,value)

但我有大约 10 个组,Dict 包含很多对,运行时间太长,代码也不好看。我在 python 中找到了最好的解决方案来做更快更好的方法!

提前致谢:)

【问题讨论】:

  • 用您自己的话来说,您认为re.findall ("ddd", key) or ("aaa", key) 是什么意思?为什么?怎么样?
  • @KarlKnechtel 用这个,找到图案并打印出来。
  • 当代码re.findall ("ddd", key) or ("aaa", key)运行时,你期望re.findall函数运行多少次?为什么?如何?用你自己的话来说,在 Python 中,or 关键字是什么意思,它是如何工作的?

标签: python performance sorting


【解决方案1】:

你可以编写一个函数来创建一个组并多次运行它:

resultDict = {"aaa10" : 10, "eee343": 88 ,"aaa15" : 40,"bbb60" : 10,"aaa13" : 80,"bbb60" : 10,"aaa30" : 50,"ccc99" : 100, "aaa56" : 10,"ccc67" : 10,"aaa78" : 40, "ddd78" :88 , "eee343" : 88 }

def group_finder(group_index,resultDict,keys):
    
    group_list=[]
    
    for key in keys:
        group_list.extend(
        list(filter(lambda string: string.startswith(key),resultDict))
                )
    
    print('Group',group_index)
    for key in group_list:
        print(key,',',resultDict[key])
    
group_finder(1,resultDict,['eee','ccc'])
group_finder(2,resultDict,['bbb'])
group_finder(3,resultDict,['ddd','aaa'])

打印出来的

Group 1
eee343 , 88
ccc99 , 100
ccc67 , 10
Group 2
bbb60 , 10
Group 3
ddd78 , 88
aaa10 , 10
aaa15 , 40
aaa13 , 80
aaa30 , 50
aaa56 , 10
aaa78 , 40

【讨论】:

    【解决方案2】:

    一种解决方法:

    import pandas as pd
    
    
    d = {"aaa10" : 10, "eee343": 88 ,"aaa15" : 40,"bbb60" : 10,"aaa13" : 80,"bbb60" : 10,"aaa30" : 50,"ccc99" : 100, "aaa56" : 10,"ccc67" : 10,"aaa78" : 40, "ddd78" :88 , "eee343" : 88 }
    df = pd.DataFrame([d]).T.reset_index()
    
    map_dict = {
        "eee" : 1,
        "ccc" : 1,
        "bbb" : 2,
        "ddd" : 3,
        "aaa" : 3
    }
    df['index'].astype(str).str[:3].map(map_dict)
    for index,(grp,x) in enumerate(df.groupby(df['index'].astype(str).str[:3].map(map_dict)),1):
        print('Group', index)
        for k,v in x.to_dict(orient='split')['data']:
            print(k,v)
    

    输出:

    Group 1
    eee343 88
    ccc99 100
    ccc67 10
    Group 2
    bbb60 10
    Group 3
    aaa10 10
    aaa15 40
    aaa13 80
    aaa30 50
    aaa56 10
    aaa78 40
    ddd78 88
    

    【讨论】:

    • 这很有帮助,但希望 eeeccc 模式必须在 group-1 和 bbb 在 group-2 和 aaaddd 在 group-3 等等on...group 是每对的键、值集的标题,您可以查看我想要的输出。我认为,需要进行小修改,这对我很有帮助
    【解决方案3】:

    这是一个不需要 Pandas 的纯 Python 解决方案:

    def getGroups(dictionary: dict, groups: list, subStringLen = 3) -> dict:
        return [(dict([(k, v) for k, v in dictionary.items() if k[:subStringLen] == group])) for group in groups]
    

    你可以像这样使用:

    resultDict = {"aaa10" : 10, "eee343": 88, "aaa15" : 40,"bbb60" : 10,"aaa13" : 80,"bbb60" : 10,"aaa30" : 50,"ccc99" : 100, "aaa56" : 10,"ccc67" : 10,"aaa78" : 40, "ddd78" :88 , "eee343" : 88 }
    
    print("Group 1")
    print(getGroups(resultDict, ["eee", "ccc"]))
    
    print("Group 2")
    print(getGroups(resultDict, ["bbb"]))
    
    print("Group 3")
    print(getGroups(resultDict, ["ddd", "aaa"]))
    

    返回

    Group 1
    [{'eee343': 88}, {'ccc99': 100, 'ccc67': 10}]
    Group 2
    [{'bbb60': 10}]
    Group 3
    [{'ddd78': 88}, {'aaa10': 10, 'aaa15': 40, 'aaa13': 80, 'aaa30': 50, 'aaa56': 10, 'aaa78': 40}]
    

    此答案使用嵌套列表推导,但它所做的只是针对每个组,在给定字典中搜索具有该组子字符串的键。为了获得您所追求的确切输出,您可以展平列表。

    【讨论】:

      猜你喜欢
      • 2017-12-25
      • 2017-01-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-24
      相关资源
      最近更新 更多