简体   繁体   English

Python:列表中每个字典的组合

[英]Python: combinations for each dictionary in a list

Not sure if this is possible or not. 不知道这是否可能。 Assuming I have a list of dictionaries like follows: 假设我有一个字典列表,如下所示:

stocks = [{'name': 'bob', 'avg_returns': '18.345', 'sd_returns': '2.14', 'var_returns': '34.2334'}, {another_dict}, {another_dict}]

Then I have another list, like so: 然后我有另一个列表,像这样:

weights_list = [(0.95, 0.025, 0.025),
               (0.90, 0.05, 0.05),
               (0.85, 0.075, 0.075),
               (0.80, 0.1, 0.1),
               (0.75, 0.125, 0.125),
               (0.70, 0.15, 0.15)]

The end result would be to attach a different (whole) dictionary to each sets of lists within weights_list, as demonstrated below: 最终结果是将不同的(整个)字典附加到weights_list中的每个列表集,如下所示:

[({'name': 'bob', 'avg_returns': '18.345', 'sd_returns': '2.14', 'var_returns': '34.2334'}, 0.95),({another_dict}, 0.025), ({another_dict}, 0.025)]

The reason I was hoping to use it is so that I can call certain dictionary key values to multiply against its respective weight allocated. 我之所以希望使用它,是因为我可以调用某些字典键值来乘以其分配的权重。

The code I have now, all written by @zehnpaard is as follows: 我现在使用@zehnpaard编写的所有代码如下:

def portfolios(stocks, weights_list):
    for x in stocks:
        for stock_triplet in itertools.combinations(x, 3):
            for weights in weights_list:
                unique_weight_orders = set(itertools.permutations(weights))
                for weight_order in unique_weight_orders:
                    yield zip(stock_triplet, weight_order)

for port in portfolios(stocks,weights_list):
    print port

However this prints out a combination for every dictionary key, as opposed to the entire dictionary. 但是,这会打印出每个字典键的组合,而不是整个字典。 I tried for x in len(stocks) , but it returns an error 'int' object is not iterable as many of you would probably assume. 我尝试for x in len(stocks) ,但是它返回错误'int' object is not iterable正如许多人可能会'int' object is not iterable那样。

Thanks in advance for any help received! 预先感谢您提供的任何帮助!

I have assumed 2 dictionaries within your list like so: 我假设您的列表中有2个字典,如下所示:

stocks = [{'name': 'bob', 'avg_returns': '18.345', 'sd_returns': '2.14', 'var_returns': '34.2334'}, { 'abc': 456 }, { 'abc': 123, 98.6: 37 }]

the following code snippet, causes it to print every combination: 以下代码段,使其打印每个组合:

for weights in weights_list:
    unique_weight_orders = set(itertools.permutations(weights))
    for weight_order in unique_weight_orders:
        yield zip(stock_triplet, weight_order)

Current output: 电流输出:

[('sd_returns', 0.95), ('var_returns', 0.025), ('name', 0.025)]
[('sd_returns', 0.025), ('var_returns', 0.025), ('name', 0.95)]
[('sd_returns', 0.025), ('var_returns', 0.95), ('name', 0.025)]
[('sd_returns', 0.9), ('var_returns', 0.05), ('name', 0.05)]
[('sd_returns', 0.05), ('var_returns', 0.9), ('name', 0.05)]
[('sd_returns', 0.05), ('var_returns', 0.05), ('name', 0.9)]
[('sd_returns', 0.075), ('var_returns', 0.075), ('name', 0.85)]
[('sd_returns', 0.075), ('var_returns', 0.85), ('name', 0.075)]
[('sd_returns', 0.85), ('var_returns', 0.075), ('name', 0.075)]
[('sd_returns', 0.1), ('var_returns', 0.1), ('name', 0.8)]
[('sd_returns', 0.8), ('var_returns', 0.1), ('name', 0.1)]
[('sd_returns', 0.1), ('var_returns', 0.8), ('name', 0.1)]
[('sd_returns', 0.75), ('var_returns', 0.125), ('name', 0.125)]
[('sd_returns', 0.125), ('var_returns', 0.125), ('name', 0.75)]
[('sd_returns', 0.125), ('var_returns', 0.75), ('name', 0.125)]
[('sd_returns', 0.7), ('var_returns', 0.15), ('name', 0.15)]
[('sd_returns', 0.15), ('var_returns', 0.7), ('name', 0.15)]
[('sd_returns', 0.15), ('var_returns', 0.15), ('name', 0.7)]
[('sd_returns', 0.95), ('var_returns', 0.025), ('avg_returns', 0.025)]
[('sd_returns', 0.025), ('var_returns', 0.025), ('avg_returns', 0.95)]
[('sd_returns', 0.025), ('var_returns', 0.95), ('avg_returns', 0.025)]
[('sd_returns', 0.9), ('var_returns', 0.05), ('avg_returns', 0.05)]
[('sd_returns', 0.05), ('var_returns', 0.9), ('avg_returns', 0.05)]
[('sd_returns', 0.05), ('var_returns', 0.05), ('avg_returns', 0.9)]
[('sd_returns', 0.075), ('var_returns', 0.075), ('avg_returns', 0.85)]
[('sd_returns', 0.075), ('var_returns', 0.85), ('avg_returns', 0.075)]
[('sd_returns', 0.85), ('var_returns', 0.075), ('avg_returns', 0.075)]
[('sd_returns', 0.1), ('var_returns', 0.1), ('avg_returns', 0.8)]
[('sd_returns', 0.8), ('var_returns', 0.1), ('avg_returns', 0.1)]
[('sd_returns', 0.1), ('var_returns', 0.8), ('avg_returns', 0.1)]
[('sd_returns', 0.75), ('var_returns', 0.125), ('avg_returns', 0.125)]
[('sd_returns', 0.125), ('var_returns', 0.125), ('avg_returns', 0.75)]
[('sd_returns', 0.125), ('var_returns', 0.75), ('avg_returns', 0.125)]
[('sd_returns', 0.7), ('var_returns', 0.15), ('avg_returns', 0.15)]
[('sd_returns', 0.15), ('var_returns', 0.7), ('avg_returns', 0.15)]
[('sd_returns', 0.15), ('var_returns', 0.15), ('avg_returns', 0.7)]
[('sd_returns', 0.95), ('name', 0.025), ('avg_returns', 0.025)]
[('sd_returns', 0.025), ('name', 0.025), ('avg_returns', 0.95)]
[('sd_returns', 0.025), ('name', 0.95), ('avg_returns', 0.025)]
[('sd_returns', 0.9), ('name', 0.05), ('avg_returns', 0.05)]
[('sd_returns', 0.05), ('name', 0.9), ('avg_returns', 0.05)]
[('sd_returns', 0.05), ('name', 0.05), ('avg_returns', 0.9)]
[('sd_returns', 0.075), ('name', 0.075), ('avg_returns', 0.85)]
[('sd_returns', 0.075), ('name', 0.85), ('avg_returns', 0.075)]
[('sd_returns', 0.85), ('name', 0.075), ('avg_returns', 0.075)]
[('sd_returns', 0.1), ('name', 0.1), ('avg_returns', 0.8)]
[('sd_returns', 0.8), ('name', 0.1), ('avg_returns', 0.1)]
[('sd_returns', 0.1), ('name', 0.8), ('avg_returns', 0.1)]
[('sd_returns', 0.75), ('name', 0.125), ('avg_returns', 0.125)]
[('sd_returns', 0.125), ('name', 0.125), ('avg_returns', 0.75)]
[('sd_returns', 0.125), ('name', 0.75), ('avg_returns', 0.125)]
[('sd_returns', 0.7), ('name', 0.15), ('avg_returns', 0.15)]
[('sd_returns', 0.15), ('name', 0.7), ('avg_returns', 0.15)]
[('sd_returns', 0.15), ('name', 0.15), ('avg_returns', 0.7)]
[('var_returns', 0.95), ('name', 0.025), ('avg_returns', 0.025)]
[('var_returns', 0.025), ('name', 0.025), ('avg_returns', 0.95)]
[('var_returns', 0.025), ('name', 0.95), ('avg_returns', 0.025)]
[('var_returns', 0.9), ('name', 0.05), ('avg_returns', 0.05)]
[('var_returns', 0.05), ('name', 0.9), ('avg_returns', 0.05)]
[('var_returns', 0.05), ('name', 0.05), ('avg_returns', 0.9)]
[('var_returns', 0.075), ('name', 0.075), ('avg_returns', 0.85)]
[('var_returns', 0.075), ('name', 0.85), ('avg_returns', 0.075)]
[('var_returns', 0.85), ('name', 0.075), ('avg_returns', 0.075)]
[('var_returns', 0.1), ('name', 0.1), ('avg_returns', 0.8)]
[('var_returns', 0.8), ('name', 0.1), ('avg_returns', 0.1)]
[('var_returns', 0.1), ('name', 0.8), ('avg_returns', 0.1)]
[('var_returns', 0.75), ('name', 0.125), ('avg_returns', 0.125)]
[('var_returns', 0.125), ('name', 0.125), ('avg_returns', 0.75)]
[('var_returns', 0.125), ('name', 0.75), ('avg_returns', 0.125)]
[('var_returns', 0.7), ('name', 0.15), ('avg_returns', 0.15)]
[('var_returns', 0.15), ('name', 0.7), ('avg_returns', 0.15)]
[('var_returns', 0.15), ('name', 0.15), ('avg_returns', 0.7)]

if you change it to skip permutations, like so: 如果将其更改为跳过排列,如下所示:

for weights in weights_list:
    yield zip(stock_triplet, weights)

It gives output: 它给出输出:

[('sd_returns', 0.95), ('var_returns', 0.025), ('name', 0.025)]
[('sd_returns', 0.9), ('var_returns', 0.05), ('name', 0.05)]
[('sd_returns', 0.85), ('var_returns', 0.075), ('name', 0.075)]
[('sd_returns', 0.8), ('var_returns', 0.1), ('name', 0.1)]
[('sd_returns', 0.75), ('var_returns', 0.125), ('name', 0.125)]
[('sd_returns', 0.7), ('var_returns', 0.15), ('name', 0.15)]
[('sd_returns', 0.95), ('var_returns', 0.025), ('avg_returns', 0.025)]
[('sd_returns', 0.9), ('var_returns', 0.05), ('avg_returns', 0.05)]
[('sd_returns', 0.85), ('var_returns', 0.075), ('avg_returns', 0.075)]
[('sd_returns', 0.8), ('var_returns', 0.1), ('avg_returns', 0.1)]
[('sd_returns', 0.75), ('var_returns', 0.125), ('avg_returns', 0.125)]
[('sd_returns', 0.7), ('var_returns', 0.15), ('avg_returns', 0.15)]
[('sd_returns', 0.95), ('name', 0.025), ('avg_returns', 0.025)]
[('sd_returns', 0.9), ('name', 0.05), ('avg_returns', 0.05)]
[('sd_returns', 0.85), ('name', 0.075), ('avg_returns', 0.075)]
[('sd_returns', 0.8), ('name', 0.1), ('avg_returns', 0.1)]
[('sd_returns', 0.75), ('name', 0.125), ('avg_returns', 0.125)]
[('sd_returns', 0.7), ('name', 0.15), ('avg_returns', 0.15)]
[('var_returns', 0.95), ('name', 0.025), ('avg_returns', 0.025)]
[('var_returns', 0.9), ('name', 0.05), ('avg_returns', 0.05)]
[('var_returns', 0.85), ('name', 0.075), ('avg_returns', 0.075)]
[('var_returns', 0.8), ('name', 0.1), ('avg_returns', 0.1)]
[('var_returns', 0.75), ('name', 0.125), ('avg_returns', 0.125)]
[('var_returns', 0.7), ('name', 0.15), ('avg_returns', 0.15)]

Complete code after the change: 更改后的完整代码:

import itertools

stocks = [{'name': 'bob', 'avg_returns': '18.345', 'sd_returns': '2.14', 'var_returns': '34.2334'}, { 'abc': 456 }, { 'abc': 123, 98.6: 37 }]

weights_list = [(0.95, 0.025, 0.025),
                (0.90, 0.05, 0.05),
                (0.85, 0.075, 0.075),
                (0.80, 0.1, 0.1),
                (0.75, 0.125, 0.125),
                (0.70, 0.15, 0.15)]

def portfolios(stocks, weights_list):
    for x in stocks:
        for stock_triplet in itertools.combinations(x, 3):
            for weights in weights_list:
                yield zip(stock_triplet, weights)

for port in portfolios(stocks,weights_list):
    print port

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM