我有一个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}}
]
}]
答案 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]