2014-07-06 73 views
-1

我有一个名为chromosome的列表,其中包含40个条目。每个条目都是一个二进制数字。例如,错误“'int'对象不可自订”虽然对象是一个列表

chromosome = [1, 1, 0, 0, 0, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 1]

我需要每4个二进制文件转换为整数。例如,整数列表将

intlist = [12, 6 ... ]

因为1100b = 12等。

为了解决这个问题,我写了下面的Python功能

def makeChromosomeInteger(chromosome, chrom_size): 
    intstring = [0] * 10 
    i = 0 
    for j in range(0, 40, 4): 
     intstring[i] = str(chromosome[j]) + str(chromosome[j+1]) + str(chromosome[j+2]) + str(chromosome[j+3]) 
     intstring[i] = int(intstring[i],2) 
     i = i+1 

    return intstring 

这在大多数情况下 - 功能每4个二进制文件的确转换为整数。但是,迟早我得到了如下错误信息:

builtins.TypeError: 'int' object is not subscriptable 

,问题似乎是intstring[i] = int(intstring[i],2)。我真的不知道为什么会发生这种情况。 intstring也不是chromosome是一个整数,所以为什么我不能地址这些列表?

在此先感谢!

PS:如果有任何其他聪明的方法对这些条目我是开放的建议:)

+1

您显示的代码没有问题。 – ooga

+1

你说这个函数大多是有效的,但迟早会出错。这意味着错误不是与函数本身,而是调用该函数的代码。你确定没有错误,它最终传递一个int而不是一个列表?使用try/catch块并在'TypeError'后将参数打印到函数中。 – Dunes

+0

为什么downvote? – TheWaveLad

回答

1

您的代码应该工作转换,但这里的一个简化:

chromosome = [1, 1, 0, 0, 0, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 
       0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 
       1, 0, 0, 1, 0, 0, 1, 1] 

def makeIntList(chrom): 
    intlist = [] 
    for j in range(0, len(chrom), 4): 
     intlist.append(chrom[j]*8 + chrom[j+1]*4 + chrom[j+2]*2 + chrom[j+3]) 
    return intlist 

intlist = makeIntList(chromosome) 
print(intlist) 
+0

非常感谢您的简化和检查我的代码。你是对的,我的代码是正确的。这是其他一些导致麻烦的功能。 – TheWaveLad

1

尝试,而不是下面的为您的代码:

cs = [str(i) for i in chromosome]  # Convert to strings 
grp = [cs[i:i+4] for i in range(0,len(cs),4)] # Group into fours 
ints = [int(''.join(g),2) for g in grp] # concatenate and convert as base 2. 

您的示例结果是[12, 6, 14, 0, 7, 8, 5, 0, 9, 3]

相关问题