2012-04-17 64 views
1

问题:数组中值比较的pythonic方法?

  1. 输入是一个制表符分隔的文件。行是变量,列是样本。变量可以假定三个值(00,0,11,11),并按照需要修饰的顺序列出(v1-> vN)。有大量的行和列,所以输入文件需要以块的形式读取。

    输入如下:

    s1 s2 s3 s4 
    v1 00 00 11 01 
    v2 00 00 00 00 
    v3 01 11 00 00 
    v4 00 00 00 00 
    (...) 
    
  2. 我所试图做的是输入拆分成几排,这里的作品是足够的样品是每一个独特的只是大的碎片。在上面的例子中,从v1开始,第一个块应该在v3处结束,因为在该点有足够的信息表明样本是唯一的。下一个块将从第4版开始并重复该过程。任务在达到最后一行时结束。块应打印在输出文件中。


我尝试:

我试图做的是使用CSV模块以产生由列表组成的阵列,每个含有单一变量的状态(00,01,00)适用于所有样品。或者,通过旋转输入,为每个变量创建包含样本状态的列表。如果最好使用v1 = ['00','00','11','01']或者s1 = ['00',我会问这个工作应该专注于列还是行,,即。 ,'00','01','00',...]

以下代码是指我试图将列问题更改为行问题的旋转操作。 (对不起,我笨拙的Python语法,是我能做的最好的)

my_infilename='my_file.txt' 
csv_infile=csv.reader(open(my_infilename,'r'), delimiter='\t') 
out=open('transposed_'+my_infilename, 'w') 
csv_infile=zip(*csv_infile) 
line_n=0 
for line in csv_infile: 
line_n+=1 
    if line_n==1: #headers 
     continue 
    else: 
     line=(','.join(line)+'\n') #just to make it readable to me 
     out.write(line) 
out.close() 

什么是解决这个问题的最好方法是什么? pivoting可以有任何帮助吗?有没有我可以依赖的内置函数?

+3

那么,您的问题是什么? – Marcin 2012-04-17 15:32:49

+0

基本上,如何用一个循环放下脚本,这将允许我识别区分每个样本所需的最小数量的有序变量。 – cometarossa 2012-04-17 15:48:59

+0

这与您发布的代码有什么关系?这个问题的哪一部分是有问题的?现在,这篇文章听起来像“我试图解决这个问题,但不能,那么你能做到吗?” – Marcin 2012-04-17 15:52:20

回答

2

假设你得到进口作为都是相同长度列表的列表CSV数据,请问这是怎么对你的工作......

def get_block(data_rows): 
    samples = [] 

    for cell in data_rows[0]: 
     samples.append('') 

    # add one row at a time to each sample and see if all are unique 
    for row_index, row in enumerate(data_rows): 
     for cell_index, cell in enumerate(row): 
      samples[cell_index] = '%s%s' % (samples[cell_index], cell) 

     are_all_unique = True 
     sample_dict = {} # use dictionary keys to find repeats 
     for sample in samples: 
      if sample_dict.get(sample): 
       # already there, so another row needed 
       are_all_unique = False 
       break 
      sample_dict[sample] = True # add the key to the dictionary 
     if are_all_unique: 
      return True, row_index 

    return False, None 

def get_all_blocks(all_rows): 
    remaining_rows = all_rows[:] # make a copy  
    blocks = [] 

    while True: 
     found_block, block_end_index = get_block(remaining_rows) 
     if found_block: 
      blocks.append(remaining_rows[:block_end_index+1]) 
      remaining_rows = remaining_rows[block_end_index+1:] 
      if not remaining_rows: 
       break 
     else: 
      blocks.append(remaining_rows[:]) 
      break 

    return blocks 


if __name__ == "__main__": 
    v1 = ['00', '00', '11', '01'] 
    v2 = ['00', '00', '00', '00'] 
    v3 = ['01', '11', '00', '00'] 
    v4 = ['00', '00', '00', '00'] 

    all_rows = [v1, v2, v3, v4] 

    blocks = get_all_blocks(all_rows) 

    for index, block in enumerate(blocks): 
     print "This is block %s." % index 
     for row in block: 
      print row 
     print 

======== =========

这是块0

[ '00', '00', '11', '01']

[ '00','00 ','00','00']

[ '01', '11', '00', '00']

这是块1。

['00','00','00','00']

+0

它看起来正是我要找的东西。感谢您的帮助,我会尽快通知您。 – cometarossa 2012-04-17 21:34:01

+0

作品奇迹。我会给你一个投票,但是我的名声太低了! – cometarossa 2012-04-18 09:12:35

0

我完全不理解你的问题(“协调变量”?“单一地确定样本”?),但我知道你正在使用csv模块并且你的缩进也是不正确的。

我不确切知道你输入的文件是什么样的,但假设它是制表符分隔的,下面的(未经测试的)脚本显示了你从输入文件中获取块的方法,将它们转换并重写为你的输出文件。

import csv 

# this is not strictly necessary, but you can define a custom dialect for input and output 

class SampleDialect (csv.Dialect): 
    delimiter = "\t" 
    quoting = csv.QUOTE_NONE  

sampledialect = SampleDialect() 

ifn = 'my_file.txt' 
ofn = 'transposed_'+ifn 

ifp = open(ifn, 'rb') 
ofp = open(ofn, 'wb') 

incsv = csv.reader(ifp, dialect=sampledialect) 
outcsv = csv.writer(ofp, dialect=sampledialect) 


header = None 
block = [] 
for lineno, samples in enumerate(incsv): 
    if lineno==0: #header 
     header = samples 
     continue 
    block.append(samples) 
    if lineno%3: 
     # end of block 
     # do something with block 
     # then write it out 
     outcsv.writerows(block) 
     block = [] 

ifp.close() 
ofp.close() 
+0

谢谢。我会按照这个方法工作。 – cometarossa 2012-04-17 21:39:29

+0

块的大小不尽相同。他希望每个块的每列都有足够的行,以便与块中的其他样本保持一致。 – agf 2012-04-18 14:22:22

+0

我更多地展示了csv读者和作者的使用。他将不得不将'if lineno%3:'行改为任何他的状况。 – 2012-04-18 15:35:45