Python一个班轮,用于多个未排序列表的平均值

时间:2016-03-15 12:32:38

标签: python

我有

形式的数据
Ns0 = [ 2 3 1 2 2 3 4 5 3 1 2 ]
As0 = [ 9 2 4 5 4 3 1 2 0 8 2 ]

我想创建Ns = [ 1 2 3 4 5 ]以及As_avg,这是As0相关Ns0中所有项目的平均值。

我知道我可以使用Ns制作Ns = list(set(Ns0)),我希望通过以下方式制作As_avg

for N in Ns:
    As_avg.append( np.mean( np.array( [a for a in As0 if ??? ] ) ) )

但是我被困在???部分。如何在a中选择与As0中的N对应的Ns0

我知道我可以通过以下方式做到这一点:

for N in Ns:
    tlist = []
    for (tN, tA) in zip(Ns0, As0):
        if( tN == N ):
            tlist.append(tA)
    As_avg.append( np.mean( np.array( tlist ) ) )

但是我希望有更多的pythonic方式来做这个

3 个答案:

答案 0 :(得分:4)

for N in Ns:
    As_avg.append( np.mean( np.array( [tA for tN, tA in zip(Ns0, As0) if tN == N]  ) ) )

但是不要试图成为“pythonic”'如果是可读性的权衡。我个人更喜欢2循环版本。

答案 1 :(得分:0)

您可以使用词典保留预期的项目,其中的密钥是Ns0中的唯一项目,值是As0中相应项目的列表,然后对值应用np.mean使用map函数:

>>> d = {}
>>> 
>>> for i,j in zip(Ns0, As0):
...     d.setdefault(i, []).append(j)
... 
>>> map(np.mean, d.values())
[6.0, 5.0, 1.6666666666666667, 1.0, 2.0]

注意这种方法的优点是您不必从Ns0创建唯一项目列表,然后您可以简单地使用一个循环。

答案 2 :(得分:0)

请记住,可读性是关键的Python值https://www.python.org/dev/peps/pep-0020/

之一

列表和字典理解对此可能很有用,但如果它们变得太复杂,则会使它难以阅读,您应该将它们分成多行。

我认为这就是解决问题的方法:

common_vals = [A_val for A_val, N_val in zip(As0, Ns0) if A_val == N_val]
As_avg = np.mean(np.asarray(common_vals))

我假设您只希望common_vals包含两个列表中显示的值,并且AND显示在同一位置。如果您只想要出现在两个列表中的值:

common_vals = [val for val in As0 if val is in Ns0]

我还要指出,变量名中的大写字母在Python中通常很糟糕,因为它违反了PEP8样式指南https://www.python.org/dev/peps/pep-0008/如果你正在处理矩阵我可以理解大写字母有时会更有意义,但是:)

希望这有帮助!