嵌套列表中的重复字符串

2024-10-05 14:24:29 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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)。你知道吗

有人能帮我修改一下我的函数来解释重复的吗?你知道吗


Tags: 用户in脚本列表lensets可能性float
3条回答
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

此外,还可以使用分数:

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)

你的代码有很多问题。你在对浮子做无用的施放。另一个原因是它不能处理超过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))

相关问题 更多 >