我有一个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计算1D列表,但我发现很难在Python中实现上述逻辑。
答案 0 :(得分:3)
要获得总数(假设每行中的第一个元素是您要跳过的字母),您可以使用
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.x中3/4
默认情况下会导致0
。
答案 1 :(得分:1)
partition2d = [['A', '1', '5'],
['B', '2', '3', '4'],
['C', '6', '7', '8', '9']]
guest_list = [0.5, 0.0, 1.0]
如果partition2d
的列表总是[字母,数字,数字......],那么
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
转换为浮动。