Python 嵌套列表中的重复字符串

Python 嵌套列表中的重复字符串,python,list,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']

设置-我有一个带有嵌套列表(称为中继集)的列表,看起来像这样:

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)


有人能帮我修改我的函数来解释重复项吗?

你的代码有很多问题。你在对浮子进行无用的投掷。另一个原因是它不能处理超过两个层次的概率。下面是一种递归方法,可以处理此问题:

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))
输出:

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

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

此外,您还可以使用分数:


把你的概率加起来。你正在设置它。从哪里来的
num\u-guards\u-in\u-set
?很抱歉,为了这个问题,我编辑了我的脚本,但漏掉了一行。我认为
num\u-guards\u-in\u-set
必须是
num\u-in\u-set
@RaydelMiranda他的公式是正确的。999在分子中出现4次。在你的书中,它出现了8次。
In [44]: prob(999, relay_sets)
Out[44]: 0.19047619047619047

In [45]: 4/21
Out[45]: 0.19047619047619047
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)