2014-09-19 2 views
0

Настройка - У меня есть список с вложенными списками (назовем его ретранслировать наборы), который выглядит примерно так:Повторяющиеся строки в вложенных списках

relay_sets = [ 
    [[80100, 'a']], 
    [[75000, 'b']], 
    [[64555, 'c']], 
    [[55000, 'd'], [44000, 'e']], 
    [[39000, 'f'], [2000, 'g']], 
    [[2000, 'h'], [999, 'i'], [999, 'j']], 
    [[999, 'k'], [999, 'l'], [343, 'm']] 
] 

Пользователь ставится в одно из множеств реле (с равномерная вероятность), а затем снова использует один из вложенных списков в подсписке с равной вероятностью. Так, например, у пользователя есть шанс 1/7 быть помещенным в [[80100, 'a']], но затем гарантируется использование [80100, 'a'], тогда как у пользователя есть 1/7 вероятность быть помещенным в [[55000, 'd'], [44000, 'e']], а затем имеет шанс 1/2 использовать [55000, 'd'].

Я написал сценарий, который находит вероятность использования определенного реле:

def prob_using_relay(relay, relaysets): 
    prob1 = 1/float(len(relaysets)) 
    for index, item in enumerate(relaysets): 
    for i in item: 
     if relay in i: 
     num_relays_in_set = len(relaysets[index]) 
     prob2 = 1/float(num_relays_in_set) 
    total_prob = float(prob1 * prob2) 
    return total_prob 

print prob_using_relay(80100, relay_sets) # gives correct answer of 0.142857142857 

Моя проблема, я не знаю, как объяснить дублей. Поэтому, если бы я хотел узнать, как использовать реле с пропускной способностью 999, ответ должен быть (2/3 * 1/7 + 2/3 * 1/7), но мой скрипт дает 1/21. Или, если бы я хотел узнать, как использовать реле с пропускной способностью 2000, ответ должен быть (1/2 * 1/7 + 1/3 * 1/7) вместо (1/2 * 1/7).

Может ли кто-нибудь помочь с изменением моей функции для учета дубликатов?

+1

Sum ваших вероятности. Вы настраиваете его вместо этого. – simonzack

+0

откуда приходит 'num_guards_in_set'? –

+0

жаль, что я отредактировал свой сценарий для целей вопроса, но пропустил линию. – tiajuana6

ответ

1

С вашим кодом связано множество проблем. Вы делаете бесполезные броски для плавания. Другим существом является то, что он не может обрабатывать вероятности более чем на 2 уровнях. Вот рекурсивный подход, который может справиться с этим:

relay_sets = [ 
    [[80100, 'a']], 
    [[75000, 'b']], 
    [[64555, 'c']], 
    [[55000, 'd'], [44000, 'e']], 
    [[39000, 'f'], [2000, 'g']], 
    [[2000, 'h'], [999, 'i'], [999, 'j']], 
    [[999, 'k'], [999, 'l'], [343, 'm']] 
] 

def prob_using_relay(relay, relaysets): 
    if isinstance(relaysets[0], int): 
     return int(relaysets[0] == relay) 
    return sum(prob_using_relay(relay, relayset) for relayset in relaysets)/len(relaysets) 

print(prob_using_relay(80100, relay_sets)) 
1
def prob(bandwidth, relaysets): 
    answer = 0.0 
    for subl in relaysets: 
     answer += sum(1.0 for r in subl if r[0] == bandwidth)/len(subl) 
    return answer/len(relaysets) 

Выхода:

In [44]: prob(999, relay_sets) 
Out[44]: 0.19047619047619047 

In [45]: 4/21 
Out[45]: 0.19047619047619047 
0

Кроме того, вы можете использовать дроби:

from fractions import Fraction 

def prob_using_relay(relay, relaysets): 
    prob = Fraction(0,1) 
    for set in relaysets: 
     if isinstance(set, list) and relay in set: 
      prob += Fraction(1, len(relaysets)) 
     elif isinstance(set, list): 
      prob += Fraction(1, len(relaysets)) * prob_using_relay(relay, set)   
    return prob 

prob_using_relay(999, relay_sets) 
Out: Fraction(4, 21) 
Смежные вопросы