1

欠損値 (None) を前回の既知の値に置き換えたい。これは私のコードです。しかし、うまくいきません。より良いアルゴリズムの提案はありますか?

t = [[1, 3, None, 5, None], [2, None, None, 3, 1], [4, None, 2, 1, None]]
def treat_missing_values(table):
    for line in table:
        for value in line:
            if value == None:
                value = line[line.index(value)-1]
    return table

print treat_missing_values(t)
4

6 に答える 6

4

これはおそらく私がそれを行う方法です:

>>> def treat_missing_values(table):
...     for line in table:
...         prev = None
...         for i, value in enumerate(line):
...             if value is None:
...                 line[i] = prev
...             else:
...                 prev = value
...     return table
... 
>>> treat_missing_values([[1, 3, None, 5, None], [2, None, None, 3, 1], [4, None, 2, 1, None]])
[[1, 3, 3, 5, 5], [2, 2, 2, 3, 1], [4, 4, 2, 1, 1]]
>>> treat_missing_values([[None, 3, None, 5, None], [2, None, None, 3, 1], [4, None, 2, 1, None]])
[[None, 3, 3, 5, 5], [2, 2, 2, 3, 1], [4, 4, 2, 1, 1]]
于 2012-01-25T02:57:15.477 に答える
3

リストがNoneで始まる場合、または値が重複している場合、値からインデックスを検索することは機能しません。これを試して:

def treat(v):
   p = None
   r = []
   for n in v:
     p = p if n == None else n
     r.append(p)
   return r

def treat_missing_values(table):
   return [ treat(v) for v in table ]

t = [[1, 3, None, 5, None], [2, None, None, 3, 1], [4, None, 2, 1, None]]
print treat_missing_values(t)

これはあなたの宿題ではない方がいいです、おい。

編集すべてのFPファンのための機能バージョン:

def treat(l):
  def e(first, remainder):
     return [ first ] + ([] if len(remainder) == 0 else e(first if remainder[0] == None else remainder[0], remainder[1:]))
  return l if len(l) == 0 else e(l[0], l[1:])   
于 2012-01-25T02:59:54.743 に答える
3

Python で割り当てを行う場合、メモリ内のオブジェクトに参照を作成しているだけです。値を使用してリスト内のオブジェクトを設定することはできません。これは、値がメモリ内の別のオブジェクトを効果的に参照しているためです。

必要なことを行うには、リストの正しいインデックスに直接設定する必要があります。

述べたように、内側のリストの 1 つに最初の値として None がある場合、アルゴリズムは機能しません。

したがって、次のようにすることができます。

t = [[1, 3, None, 5, None], [2, None, None, 3, 1], [4, None, 2, 1, None]]
def treat_missing_values(table, default_value):
    last_value = default_value
    for line in table:
        for index in xrange(len(line)):
            if line[index] is None:
                line[index] = last_value
            else:
                last_value = line[index]
    return table

print treat_missing_values(t, 0)
于 2012-01-25T02:54:46.463 に答える
2

これは、indexメソッドが、渡された引数の最初の出現を返すためです。たとえば、最初の行では、 line.index(None) は常に 2 を返します。これは、そのリストで None が最初に出現するためです。

代わりにこれを試してください:

    def treat_missing_values(table):
        for line in table:
            for i in range(len(line)):
                if line[i] == None:
                    if i != 0:
                        line[i] = line[i - 1]
                    else:
                        #This line deals with your other problem: What if your FIRST value is None?
                        line[i] = 0 #Some default value here
        return table
于 2012-01-25T02:54:28.757 に答える
1

グローバル変数を使用して、最新の有効な値を追跡します。そして、私map()は反復に使用します。

t = [[1, 3, None, 5, None], [2, None, None, 3, 1], [4, None, 2, 1, None]]

prev = 0
def vIfNone(x):
    global prev
    if x:
       prev = x
    else:
       x = prev
    return x

print map( lambda line: map( vIfNone, line ), t )

編集:マルヴォーリオ、ここ。あなたの答えを書いて申し訳ありませんが、コメントで訂正するにはあまりにも多くの間違いがありました。

  1. if x:すべての偽の値(特に0と空の文字列)で失敗します。
  2. 可変グローバル値は悪いです。これらはスレッドセーフではなく、他の特殊な動作を生成します(この場合、リストがNoneで始まる場合、コードによって処理された最後の値に設定されます。
  3. の書き直しxは不要です。prev常に正しい値を持っています。
  4. 一般に、このようなものは、名前付けとスコープのために関数でラップする必要があります

それで:

def treat(n):
    prev = [ None ]
    def vIfNone(x):
        if x is not None:
           prev[0] = x
        return prev[0]
    return map( vIfNone, n )

(閉じた変数としてのprevの奇妙な使用に注意してください。これは、の各呼び出しに対してローカルでtreatあり、同じ呼び出しからのvIfNoneのすべての呼び出しにわたってグローバルでありtreat、まさに必要なものです。暗くておそらく邪魔なPythonの理由で私は理解していません。 、配列である必要があります。)

于 2012-01-25T03:15:34.727 に答える
0

編集1

# your algorithm won't work if the line start with None
t = [[1, 3, None, 5, None], [2, None, None, 3, 1], [4, None, 2, 1, None]]
def treat_missing_values(table):
    for line in table:
        for index in range(len(line)):
            if line[index] == None:
                line[index] = line[index-1]
    return table

print treat_missing_values(t)
于 2012-01-25T02:51:02.677 に答える