比较不相同的元素时,如何 return Python 中的计数器值?
How to return the value of a counter in Python when comparing non-identical elements?
我有以下列表:
x = [['A', 'A', 'A', 'A'], ['C', 'T', 'C', 'C'], ['G', 'T', 'C', 'C'], ['T', 'T', 'C', 'C'], ['A', 'T', 'C']]
我需要将 sub_list 中的每个元素与其他元素进行比较并记下更改的数量
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]
如果我理解的很好...
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以外的字符
- 然后通过将 sub_list 转换为集合
来避免重复
- itertools.combinations用于获取集合中元素的所有唯一组合
- 组合最终被计算
我有以下列表:
x = [['A', 'A', 'A', 'A'], ['C', 'T', 'C', 'C'], ['G', 'T', 'C', 'C'], ['T', 'T', 'C', 'C'], ['A', 'T', 'C']]
我需要将 sub_list 中的每个元素与其他元素进行比较并记下更改的数量
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]
如果我理解的很好...
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以外的字符
- 然后通过将 sub_list 转换为集合 来避免重复
- itertools.combinations用于获取集合中元素的所有唯一组合
- 组合最终被计算