仅选择python的dicts列表中的最大值

时间:2017-03-20 07:27:24

标签: python list dictionary

我有一个dicts列表如下:

[{"server":"8.8.8.8", 
  "domains":[{"google.com":[{"time":15, "serial":14}, {"time":78, "serial":14}]},
             {"intuit.com":[{"time":20, "serial":23}, {"time":91, "serial":18}]}
            ]
},
{"server":"8.8.4.4", 
 "domains":[{"google.com":[{"time":19, "serial":45}, {"time":92, "serial":76}]},
            {"intuit.com":[{"time":45, "serial":89}, {"time":93, "serial":74}]}
           ]
},
{"server":"206.67.222.222", 
 "domains":[{"google.com":[{"time":98, "serial":76}, {"time":64, "serial":54}]},
            {"intuit.com":[{"time":43, "serial":21}, {"time":65, "serial":59}]}
           ]
}]

我如何创建一个结构,我只选择每个域的dict和最大序列号,当我有相同的序列号时,选择最大时间,以便留下以下内容:

[{"server":"8.8.8.8", 
  "domains":[{"google.com":{"time":78, "serial":14}},
             {"intuit.com":{"time":20, "serial":23}}
            ]
 },
 {"server":"8.8.4.4", 
  "domains":[{"google.com":{"time":92, "serial":76}},
             {"intuit.com":{"time":45, "serial":89}}
            ]
 },
 {"server":"206.67.222.222", 
  "domains":[{"google.com":{"time":98, "serial":76}},
             {"intuit.com":{"time":65, "serial":59}}
            ]
 }]

3 个答案:

答案 0 :(得分:1)

试试这个(d是你的词典):

for item in d:
    for i in item["domains"]:
        for k, v in i.items():
            c = sorted([(j["time"], j["serial"]) for j in v], key=lambda x: (x[1], x[0]))
            i[k] = {"time": c[-1][0], "serial": c[-1][1]}

print d

答案 1 :(得分:1)

使用内置<Style TargetType="Navigation:HtNavigationMenuQuickLinkItem"> <Style.Resources> <BooleanToVisibilityConverter x:Key="BoolToVis"/> </Style.Resources> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="Navigation:HtNavigationMenuQuickLinkItem"> <Controls:MyButton Width="40" Height="40" Margin="10,10,10,0"> <Viewbox Margin="3"> <Controls:HtMenuIcon x:Name="icon" Visibility="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=IsQuicklink, Converter={StaticResource BoolToVis}}"/> </Viewbox> </Controls:MyButton > <ControlTemplate.Triggers> <DataTrigger Binding="{Binding QuickLinkSymbol, RelativeSource={RelativeSource TemplatedParent}}" Value="Home"> <Setter TargetName="icon" Property="Style" Value="{StaticResource Home}"/> </DataTrigger> </ControlTemplate.Triggers> </ControlTemplate> </Setter.Value> </Setter> </Style> 函数的解决方案:

max()

输出:

import json

# l is your initial list of dicts
for item in l:
    for d in item['domains']:
        for k, v in d.items():
            # whether `serial` numbers are unique 
            has_uniq_serial = len(set([i['serial'] for i in v])) > 1
            d[k] = max(v, key=lambda o: o['serial']) if has_uniq_serial else max(v, key=lambda o: o['time'])

# `json.dumps` used for pretty printing of nested dicts
print(json.dumps(l, indent=4))

答案 2 :(得分:0)

您可以根据需求为每个域排序时间序列列表并获取第一个,让变量data成为您的输入列表:

def domain_sorter(d):
    def compare(x, y):
        k = y['serial'] - x['serial']
        j = y['time'] - x['time']

        return k if k != 0 else j
    return sorted(d, cmp=compare)

def filter_domain(domain):
    for k, v in domain.items():
        return {
            k: domain_sorter(v)[0]
        }

print [{
    "server": e['server'],
    "domains": [filter_domain(domain) for domain in e['domains']]
} for e in data]