我有一个字典如下:
package application;
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;
public class MainApp extends Application {
public static void main(String[] args) {
launch(args);
}
@Override
public void start(Stage primaryStage) throws Exception {
FXMLLoader loader = new FXMLLoader(
getClass().getResource("/design/Login.fxml"));
Parent root = loader.load();
LoginController loginController = loader.getController();
loginController.loggedInProperty().addListener((obs, wasLoggedIn, isNowLoggedIn) -> {
if (isNowLoggedIn) {
// user is now logged in, show welcome screen...
}
});
primaryStage.setTitle("Benutzerverwaltung");
primaryStage.setScene(new Scene(root));
primaryStage.show();
}
}
我想将前面具有相同数字的所有值(例如{('20144', 'Wirtschaftskammer Österreich Fachverband der Telekommunikations- und Rundfunkunternehmungen', 'Bezirksrundschau Oberösterreich', '4'): 12321.88, ('20143', 'Wirtschaftskammer Niederösterreich Fachgruppe Unternehmensberatung und Informationstechnologie NÖ', 'trend', '31'): 5700.53, ('20144', 'Wirtschaftskammer Tirol - Sparte Gewerbe und Handwerk Innung der Lebensmittelgewerbe', 'ORF Radio Tirol', '4'): 5861.56, ('20144', 'Bundesministerium für Land- und Forstwirtschaft Umwelt und Wasserwirtschaft', 'Weekend Magazin', '2'): 17355.1, ('20144', 'Bundesministerium für Land- und Forstwirtschaft Umwelt und Wasserwirtschaft', 'Woman', '2'): 12911.5, ('20144', 'Bundesministerium für Wissenschaft Forschung und Wirtschaft', 'Die Presse', '31'): 30965.4, ('20143', 'Bundesministerium für Europa Integration und Äußeres', 'Kronen Zeitung', '4'): 52490.46,.......)}
)和末尾的相同数字(20144
或2
相加)。
我想到了一个词典理解,但我正在努力比较我需要的键。我怎样才能轻松比较它们?
答案 0 :(得分:1)
<强>解决方案:强>
trimmed={}
for k,v in data.items():
trimmed.setdefault((k[0],k[-1]),[]).append(v)
{k:sum(v) for k,v in trimmed.items()}
<强>输出:强>
{('20144', '4'): 18183.44, ('20144', '31'): 30965.4, ('20143', '31'): 5700.53, ('20144', '2'): 30266.6, ('20143', '4'): 52490.46}
根据您的示例,这是trimmed
循环后for
的样子:
{('20144', '4'): [12321.88, 5861.56], ('20144', '31'): [30965.4], ('20143', '4'): [52490.46], ('20144', '2'): [12911.5, 17355.1], ('20143', '31'): [5700.53]}
<强>解释强>
for
循环遍历您的示例数据中的数据键(k
)和键值(v
)。如果新词典(k[0],k[-1])
中不存在键('20144','4'):
(即键元组中的第一个和最后一个值 - 例如trimmed
),则会创建一个空白列表并显示值(v
)被追加。如果密钥确实存在,则只需附加值。
完成trimmed
字典后,简单的字典理解对所有这些列表进行求和。
修改强>
正如评论中所指出的,如果性能问题,您还可以使用collections
中的defaultdict:
from collections import defaultdict
trimmed=defaultdict(float)
for k,v in data.items():
trimmed[(k[0],k[-1])]+=v
这里的值存储在trimmed
中。 trimmed
defaultdict中新初始化的密钥为0.0
。然后,您只需添加到位v
即可。
答案 1 :(得分:1)
这可以为您提供所需的结果:
dict = {('20144', 'Bundesministerium f\xc3\xbcr Land- und Forstwirtschaft Umwelt und Wasserwirtschaft', 'Woman', '2'): 12911.5, ('20144', 'Wirtschaftskammer Tirol - Sparte Gewerbe und Handwerk Innung der Lebensmittelgewerbe', 'ORF Radio Tirol', '4'): 5861.56, ('20144', 'Bundesministerium f\xc3\xbcr Land- und Forstwirtschaft Umwelt und Wasserwirtschaft', 'Weekend Magazin', '2'): 17355.1, ('20144', 'Bundesministerium f\xc3\xbcr Wissenschaft Forschung und Wirtschaft', 'Die Presse', '31'): 30965.4, ('20144', 'Wirtschaftskammer \xc3\x96sterreich Fachverband der Telekommunikations- und Rundfunkunternehmungen', 'Bezirksrundschau Ober\xc3\xb6sterreich', '4'): 12321.88, ('20143', 'Wirtschaftskammer Nieder\xc3\xb6sterreich Fachgruppe Unternehmensberatung und Informationstechnologie N\xc3\x96', 'trend', '31'): 5700.53, ('20143', 'Bundesministerium f\xc3\xbcr Europa Integration und \xc3\x84u\xc3\x9feres', 'Kronen Zeitung', '4'): 52490.46}
sum_by_key = {}
filter_obj = None
for key, value in dict.items():
sum_key = (key[0], key[-1])
if sum_key in sum_by_key:
sum_by_key[sum_key] += value
else:
sum_by_key[sum_key] = value
输出:
{('20144', '2'): 30266.6, ('20143', '31'): 5700.53, ('20144', '31'): 30965.4, ('20144', '4'): 18183.44, ('20143', '4'): 52490.46}
答案 2 :(得分:0)
您可以使用itertools.groupby
。看看以下代码是否适合你(我使用d
作为你的词典)。
编辑:dict需要排序
fields = lambda k: (k[0], k[3])
for k, i in itertools.groupby(sorted(d, key=fields), key=fields):
...: print(k, sum(d[v] for v in i))
('20143', '31') 5700.53
('20143', '4') 524.23
('20144', '2') 30266.6
('20144', '31') 30965.4
('20144', '4') 18183.44
答案 3 :(得分:0)
以下是利用标准库中的defaultdict
一次完成的方法:
import collections
output_dict = collections.defaultdict(float)
for key, value in input_dict.items():
output_dict[ (key[0], key[-1]) ] += value
# show the output
print('\n'.join('%r: %r' % (key,value) for key, value in output_dict.items()))
打印如下:
('20144', '2'): 30266.6
('20143', '31'): 5700.53
('20144', '31'): 30965.4
('20144', '4'): 18183.44
('20143', '4'): 52490.46