2015-12-01 23 views
2

由于我是python编程的新手,我很难编写python程序。我正在计算一个长列表中的三个数字和制表符的七个对象(?)。然后我需要找到哪一组数字(三位数的倍数)在列表中具有最大数量。这些数字由一个制表符分隔,并且这组数字是七位数字。例如:在长列表中计算数字集

['128','130','140','145','','','','283','379','','','','','','175','183','187','','','',''etc.] 

列表中的第一组数字和制表符分别是128,130,140,​​145,制表符,制表符,制表符。列表中的第二组数字和标签是283,379,标签,标签,标签,标签,标签。最后,列表中的第三组数字是175,183,187,选项卡,选项卡,选项卡,选项卡。

我想计算七组数字和制表符中的三位数字,然后有一个最大输出数字,其中的数字表示最多三位数字。例如:

['128','130','140','145','','','','283','379','','','','','','175','183','187','','','',''] 
this first set = 4    this second set = 2  this third set = 3 

在本例中的最终输出数应该是4,因为第一组7个对象的显示的最3位数字。这是我目前拥有的。

#!/usr/bin/env python 

allele = '128 130 140 145    283 379      175 183 187     
elementlist=allele.split('\t') 
string= str(elementlist) 
type = string.replace('\t','0') 

print type 

我将不胜感激任何想法或疑虑。

回答

0

只是一个草图:

>>> L = ['128','130','140','145','','','','283','379','','','','','','175','183','187','','','',''] 

小组:

>>> L1 = [L[i : i+7] for i in range(0, len(L), 7)] 
>>> L1 
[['128', '130', '140', '145', '', '', ''], 
['283', '379', '', '', '', '', ''], 
['175', '183', '187', '', '', '', '']] 

元素的子群:

>>> L2 = [sum(x.isdigit() for x in SL) for SL in L1] 
>>> L2 
[4, 2, 3] 

最大:

>>> max(L2) 
4 
0

如果你所需要的只是最长的段,那么你可能只想保留一个对最长段的起点和长度的引用,因为这样可以避免复制你在内存中不需要的很多元素。这对于非常大的数据结构非常有用。在这种情况下,你可能想使用这样的事:

def longest_segment(target_list, empty_element): 
longest_start = longest_len = 0 
current_start = current_len = 0  
i=0   
for element in target_list: 
    if element == empty_element: 
     current_start = -1 
     current_len = 0 
    else: 
     if(current_start == -1): 
     current_start = i 
     current_len = current_len + 1    
    if(current_len > longest_len): 
     longest_start = current_start 
     longest_len = current_len   
    i = i + 1      
return longest_start,longest_len  

用例:

L = ['128','130','140','145','','','','283','379', 
'','','','','','175','183','187','','','',''] 

#The function supports a generic empty element so you could use other separators, like tab 
start, size = longest_segment(L,'') 

print ("The longest segment starts at:\t" ,start) 
print ("The longest segment has length:\t",size) 

#Up to this moment, there is no need to copy or keep more elements in memory. 
print ("The longest segment is:\t", L[start:start + size])