1

次のモジュールは失敗し続け、タイプ 'NoneType' のオブジェクトには len() がないことを教えてくれますが、渡されたオブジェクトはリストであり、タイプ 'NoneType' のオブジェクトではないようです。モジュールと出力を以下に含めます。

def Purge_Polyploid_MisScores(dictOfLists):
  #print "dict getting passed to Purge_Polyploid_MisScores function", dictOfLists
  for x in dictOfLists.keys():
    for y in range (0, len(dictOfLists[x])):
      print "x", x, " and y", y
      print dictOfLists[x][y]
      #if not dictOfLists[x][y]:
        #print "error at ",x,dictOfLists[str(int(x)-1)][0]
      if len(dictOfLists[x][y])>3:
        try:
          dictOfLists[x][y]=dictOfLists[x][y].remove('**')
        except:
          for z in dictOfLists[x][y]:
            if dictOfLists[x][y].count(z)>2:
              print "removed ",z," at dictOfLists[",x,"][",y,"]", dictOfLists[x][y]
              dictOfLists[x][y].remove(z)
              #I think this produces an error: dictOfLists[x][y]=dictOfLists[x][y].remove(z)
              print "now, it looks like", dictOfLists[x][y]
        if len(dictOfLists[x][y])>3:
          print "The Length is still greater than 3! at dictOfLists[",x,"][",y,"]", dictOfLists[x][y]

          #print "the reason you have a polyploid is not a mis-score"
          #print "dictOfLists[",x,"][",y,"]",dictOfLists[x][y]
      print "Reached the end of the loop"
  return dictOfLists

エラーの前のエラー/出力:

x 449  and y 100
['Yellow submarine', '273', '273']
Reached the end of the loop
x 449  and y 101
['Heartland', '250', '250', '250']
removed  250  at dictOfLists[ 449 ][ 101 ] ['Heartland', '250', '250', '250']
now, it looks like ['Heartland', '250', '250']
Reached the end of the loop
x 449  and y 102
['Julia', '116', '119', '**']
Traceback (most recent call last):
  File "fast_run.py", line 11, in <module>
    sample_names_list_e1_keys_as_numbers_e2=transpose.combine_allele_report_pipeline_dict(pipeline_directory, keeplist_address, rejected_samples_address)
  File "/Users/markfisher/transpose.py", line 887, in combine_allele_report_pipeline_dict
    samples=Purge_Polyploid_MisScores(samples)
  File "/Users/markfisher/transpose.py", line 1332, in Purge_Polyploid_MisScores
    if len(dictOfLists[x][y])>3:
TypeError: object of type 'NoneType' has no len() 

つまり、['Julia', '116', '119', '**']if で失敗しているようlen(['Julia', '116', '119', '**'])>3で、その理由がわかりません。

私のエラーを確認するのに十分な情報を皆さんに提供したことを願っています! ありがとう!

4

2 に答える 2

10

問題は次のとおりdictOfLists[x][y]=dictOfLists[x][y].remove('**')です。リストのメソッドは要素in-place をremove削除し、元のリストを変更して None を返すため、リストを None に設定しています。代わりに、ただ実行してください。dictOfLists[x][y].remove('**')

于 2012-07-10T20:28:43.650 に答える
1

@BrenBarnは正しい答えを得ました。これは答えではなくコメントであるべきだと私は知っています。しかし、コメントにコードをうまく投稿できません。

ループにdictOfLists[x][y]9 回ほどある場合は、構造的に何かが間違っています。

  • items()キーだけでなく、キーと値を取得してから値を検索するために使用します
  • enumerate反復するのではなく、リスト内のインデックスと値を取得するために使用しますrange(len(

もっと似たもの:

def Purge_Polyploid_MisScores(dictOfLists):
    for key,lst in dictOfLists.items():
        for i,val in enumerate(lst):
                print "key: %s index: %i val: %s"%(key,i,val)
                if len(val)>3:
                    val.remove('**')

書き直しが気分を害する場合は申し訳ありませんが、テストコードを投稿することを考えました(+1)ので、見返りに建設的な(うまくいけば)フィードバックを得たいと思いました

于 2012-07-10T20:35:59.287 に答える