在Python中比较不相同的元素时,如何返回计数器的值?

2024-04-20 10:00:28 发布

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

我有以下清单:

x = [['A', 'A', 'A', 'A'], ['C', 'T', 'C', 'C'], ['G', 'T', 'C', 'C'], ['T', 'T', 'C', 'C'], ['A', 'T', 'C']]

我需要比较sub\ u列表中的每个元素和其他元素,并注意更改的数量

x[0] --> # No change 
x[1] --> # 1 change (Only one conversion from C to T (T to C conversion = C to T conversion))
x[2] --> # 3 changes(G to T, T to C, G to C (T to C conversion = C to T conversion))

。。。。 因此,更改的最终计数应该是[0,1,3,2,3]


Tags: tonofrom元素only列表数量change
1条回答
网友
1楼 · 发布于 2024-04-20 10:00:28

如果我能理解。。。你知道吗

from collections import Counter
from itertools import combinations

x = [['A', 'A', 'A', 'A'],
     ['C', 'T', 'C', 'C'],
     ['G', 'T', 'C', 'C'],
     ['T', 'T', 'C', 'C'],
     ['A', 'T', 'C', 'Z']]


def divide_and_square(number, divisor):
    return (1. * number / divisor) ** 2


# part1
counters = [Counter(sub_list) for sub_list in x]
atgc_counts = [sum(val for key, val in counter.items()
                   if key.upper() in "ATGC")
               for counter in counters]
print(atgc_counts)

# part 2
conversions = []
for sl in x:
    sub_list = [base for base in sl if base.upper() in "ATGC"]
    conversions.append(len(list(combinations(set(sub_list), 2))))
print(conversions)

# bonus
squared_factor_sums = []
for counter in counters:
    total = sum(counter.itervalues())
    squared_factor_sums.append(sum([divide_and_square(val, total)
                                    for val in counter.values()]))
print(squared_factor_sums)

印刷品:

[4, 4, 4, 4, 3]
[0, 1, 3, 1, 3]
[1.0, 0.625, 0.375, 0.5, 0.25]
  • 首先除去ATGC之外的字符。你知道吗
  • 然后通过将子表转换为一个集合来避免重复
  • itertools.combinations用于获取集合中元素的所有唯一组合
  • 最后计算组合

相关问题 更多 >