2015-04-01 2 views
0

Не уверен, что это возможно или нет. Предполагая, что у меня есть список словарей нравится следующим образом:Python: комбинации для каждого словаря в списке

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

Тогда у меня есть еще один список, например, так:

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)] 

Конечный результат будет прикрепить другой (весь) словарь для каждого наборы списков в пределах 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)] 

поэтому я надеялся использовать это так, что я могу назвать некоторые из словаря ключевых значений для умножения на соответствующий вес.

код у меня есть сейчас, все написанное @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 

Однако это печатает комбинацию для каждого словаря ключа, в отличие от всего словаря. Я пробовал for x in len(stocks), но он возвращает ошибку 'int' object is not iterable, как многие из вас, вероятно, предположили бы.

Заранее благодарим за любую полученную помощь!

+0

Шаг назад на мгновение от того, как вы пытаетесь осуществить. В чем проблема, которую вы пытаетесь решить? Структура вложенных циклов выглядит неэффективной, но чего вы пытаетесь достичь? – Alexander

+0

Это не решит вашу проблему, но для справок в будущем. Вместо 'for x in len (запасы)' use 'для x в диапазоне (len (запасы))' –

+0

Это выглядит как задание для '' '' itertools. комбинации() '' '] (https://docs.python.org/2/library/itertools.html#itertools.combinations)! – pzp

ответ

1

Я предположил, 2 словаря в списке следующим образом:

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

следующий фрагмент кода, заставляет его печатать каждую комбинацию:

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) 

Токовый выход:

[('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)] 

, если вы измените его, чтобы пропустить перестановки, например:

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

Это дает выход:

[('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)] 

Полный код после изменения:

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 
+0

К сожалению, это не сработает. На самом деле это тот же результат, что и я до сих пор. Реальный список содержит тысячи словарей. Желаемый результат будет прикреплять один словарь с одним весом, в отличие от каждой клавиши в словаре до одного веса. Не знаю, имеет ли это смысл. – thefoxrocks

+0

'все должно быть сделано как можно проще, но не проще', Альберт Эйнштейн –