输入: 一个包含各种位置的列表嵌套列表。
[['61097', '12204947'],
['61097', '239293'],
['61794', '37020977'],
['61794', '63243'],
['63243', '5380636']]
输出:一个排序的列表,其中包含列表中唯一数字的计数。
[4, 3, 3, 3, 3]
这个想法非常简单,我有一个包含变量数量位置的列表(在我们的示例中,每个列表只包含2个位置,但最多可存在10个位置)。我想循环遍历每个列表,如果存在任何其他包含相同数量位置的列表,则将该列表添加到原始列表中。
例子:使用上面的输入数据并使用以下代码:
def gen_haplotype_blocks(df):
counts = []
for i in range(len(df)):
my_list = [item for item in df if any(x in item for x in df[i])]
my_list = list(itertools.chain.from_iterable(my_list))
uniq_counts = len(set(my_list))
counts.append(uniq_counts)
clear_output()
display('Currently Running ' +str(i))
return sorted(counts, reverse=True)
我得到了期望的输出。在这种情况下,当我循环遍历第一个列表
['61097', '12204947']
时,我发现我的第二个列表['61097', '239293']
都包含'61097'
,因此这些列表被连接在一起形成['61097', '12204947', '61097', '239293']
。这对于每个单独的列表都会执行,输出如下:['61097', '12204947', '61097', '239293']
['61097', '12204947', '61097', '239293']
['61794', '37020977', '61794', '63243']
['61794', '37020977', '61794', '63243', '63243', '5380636']
['61794', '63243', '63243', '5380636']
一旦完成此列表,我会计算每个列表中唯一值的数量,将其附加到另一个列表中,然后对最终列表进行排序并返回该列表。
因此,在['61097','12204947','61097','239293']
的情况下,我们有两个“61097”,一个“12204947”和一个“239293”,共3个唯一数字。
虽然我的代码可以运行,但速度非常慢。运行时间接近两个小时,仍然只在第44k行左右。
我正在寻找一种显着加快此函数速度的方法。最好不要更改原始数据结构。我非常新手Python。
提前感谢!
for i in range(len(thing))
。大多数的things
支持迭代协议,所以你可以直接使用for i in thing
。 - jjj[4, 3, 3, 3, 3]
是正确的吗?我没有看到任何数字出现了4次。 - Nathan['61097','12204947']
,我们遍历所有其他行,并发现只有第二行['61097','239293']
包含至少一个数字彼此相同(61097)。我们将这两个列表连接在一起得到['61097','12204947','61097','239293']
,当您计算其中唯一数字的数量时为3。我们对第二行执行相同的操作,唯一数字也是3。对于第三行,我们的连接列表是['61794','37020977','61794','63243']
,因为第3行和第4行至少有一个数字在两个列表中都出现了。 - dddxxx['61794','37020977','61794','63243','63243','5380636']
。唯一的数字是61794、370...、63243和5380636。这是4个数字。 - dddxxx