2

我有一个 2D 列表(可以是可变大小,具体取决于文件),如下所示:

 partition2d =  [['A', '1', '5'],
                 ['B', '2', '3', '4'],
                 ['C', '6', '7', '8', '9']]

我还有另一个清单:

  guest_list = [0.5, 0.0, 1.0]

我想计算 partition2d 的每一行中的整数个数(除了第一列有像 'A','B'.. 这样的字符),并将这个计数除以 partition2d 中的整数总数。这里会

count['1','5'] = 2. And count[ total integers in partition2d] = 9. 

我想把它分开。所以我得到 2/9 并将这个数字与 guest_list 的相应列相乘(即 partition2d 的第一行的结果将乘以第一列,即 guest_list 的 0.5,并将结果存储在一个新列表中。

新名单将是:

  new_list = [ 0.1111, 0, .4444]   

这是由 [ 2/9 * guest_list[0] , 3/9 * guest_list[1], 4/9 * guest_list[2] ] 完成的

我只知道我可以使用 list.count 计算一维列表,但我发现很难在 Python 中实现上述逻辑。

4

2 回答 2

4

要获取数字总数(假设每行中只有第一个元素是您要跳过的字母),您可以使用

total_numbers = sum(map(len, partition2d)) - len(partition2d)

即对所有行的长度求和并减去行数。

然后你可以得到你正在寻找的结果

result = [guest * (len(row) - 1.0) / total_numbers
          for guest, row in zip(guest_list, partition2d)]

zip用于从 中获取一个元素 ( guest)guest_list和一个row来自 的对partition2d。然后计算结果。

请注意,1.0存在(而不是简单的1)以确保除法是在浮点中完成的,因为guest_list包含整数会在 Python 2.x 中产生令人惊讶的结果(这已在 Python 3.x 中修复,但在 Python 2.x3/4默认情况下给出0结果)。

于 2013-09-21T17:11:31.100 回答
1
partition2d =  [['A', '1', '5'],
                ['B', '2', '3', '4'],
                ['C', '6', '7', '8', '9']]

guest_list = [0.5, 0.0, 1.0]

如果partition2d的列表始终采用 [letter, number, number, ...] 形式,则

numbers = [len(part)-1 for part in partition2d]

numbers
#>>> [2, 3, 4]

否则

numbers = [sum(v.isnumeric() for v in part) for part in partition2d]

numbers
#>>> [2, 3, 4]

更彻底

total_numbers = sum(numbers)

total_numbers
#>>> 9

然后你可以乘以它

[n/total_numbers * factor for n, factor in zip(numbers, guest_list)]
#>>> [0.1111111111111111, 0.0, 0.4444444444444444]

如果使用 Python 2,请使用v.isdigit()并转换total_numbers为浮点数。

于 2013-09-21T17:14:22.860 回答