如何重写代码更优雅

时间:2011-07-04 17:57:09

标签: python arrays list

我写了这个函数。输入和预期结果显示在docstring中。

def summarize_significance(sign_list):
    """Summarizes a series of individual significance data in a list of ocurrences.

    For a group of p.e. 5 measurements and two diferent states, the input data
    has the form:

    sign_list = [[-1, 1],
                 [0, 1],
                 [0, 0],
                 [0,-1],
                 [0,-1]]

    where -1, 0, 1  indicates decrease, no change or increase respectively.
    The result is a list of 3 items lists indicating how many measurements
    decrease, do not change or increase (as list items 0,1,2 respectively) for each state:

    returns: [[1, 4, 0], [2, 1, 2]]

    """
    swaped = numpy.swapaxes(sign_list, 0, 1)

    summary = []
    for row in swaped:
        mydd = defaultdict(int)
        for item in row:
            mydd[item] += 1
        summary.append([mydd.get(-1, 0), mydd.get(0, 0), mydd.get(1, 0)])

    return summary

我想知道是否有一种更优雅,更有效的方法来做同样的事情。一些想法?

3 个答案:

答案 0 :(得分:3)

这是一个使用较少代码并且可能更高效的代码,因为它只是在不调用swapaxes的情况下迭代sign_list一次,并且不会构建一堆字典。

summary = [[0,0,0] for _ in sign_list[0]]

for row in sign_list:
  for index,sign in enumerate(row):
    summary[index][sign+1] += 1
return summary

答案 1 :(得分:1)

不,只是采用更复杂的方式。

import itertools

def summarize_significance(sign_list):
  res = []
  for s in zip(*sign_list):
    d = dict((x[0], len(list(x[1]))) for x in itertools.groupby(sorted(s)))
    res.append([d.get(x, 0) for x in (-1, 0, 1)])
  return res

答案 2 :(得分:1)

对于初学者,你可以这样做:

swapped = numpy.swapaxes(sign_list, 0, 1)
for row in swapped:
  mydd = {-1:0, 0:0, 1:0}
  for item in row:
     mydd[item] += 1
  summary.append([mydd[-1], mydd[0], mydd[1])
return summary