嵌套列表中的重复字符串

时间:2014-09-19 15:26:11

标签: python list

设置 - 我有一个包含嵌套列表的列表(称之为中继集),如下所示:

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)

任何人都可以帮助改变我的功能以解决重复问题吗?

3 个答案:

答案 0 :(得分: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 :(得分: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

答案 2 :(得分: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)