2016-09-12 12 views
0

我有以下列表:如何在比較不相同的元素時在Python中返回計數器的值?

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]

+0

不是很清楚。你能否提供一個你對'x'input期望值正確的例子? – Tryph

+0

我在問題中提到了x輸入是什麼。 x [0]指的是x中的第一個子列表,它是['A','A','A','A'] – Biotechgeek

+0

我的評論其實並不太清楚。考慮到'x input',我想要的是預期的輸出。無論如何,我嘗試了一個答案... – Tryph

回答

1

如果我沒有理解好...

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避免被用於獲取元素的所有獨特的組合在一套
  • 組合最終計
+0

非常感謝。我有一個關於你以前的帖子的問題。計數器= [用於x中子列表的計數器(子列表)]。 ... x [1]輸出是 - > Counter({'C':3,'T':1})。現在,我想按照子列表長度(這裏是4)除以3和1,然後加上它們。所以,(3/4)^ 2 +(1/4)^ 2。有任何想法嗎?我想爲列表中的每個元素執行此操作。 – Biotechgeek

+0

@Biotechgeek這通常應該是一個新的問題......但由於我不太嚴格,查看答案更新。 – Tryph

相關問題