python中列表推导的正确语法是什么

时间:2015-08-17 14:20:55

标签: python list list-comprehension

对于python和列表理解还有些新东西,我似乎无法通过某种原因找到太多关于在线的内容。

目前正在尝试从包含多组值的列表中创建中位数平均值列表。

我确实有更长的功能,但希望使用列表理解更简单

# part of an object containing self._rawdata
def get_medians(self):
        medianlist = [sets[len(sets)//2-1] for sets in self._rawdata if not len(sets)%2 \
                      else (sets[len(sets)//2 - 2] + sets[len(sets)//2 -1])/2 for sets in self._rawdata]
        return medianlist

我收到无效语法错误,并突出显示' else',使用正确的语法是什么?

1 个答案:

答案 0 :(得分:1)

你把条件放在错误的地方。

首先尝试将循环作为常规循环,我你想要这样做:

for sets in self._rawdata:
    if not len(sets)%2:
        sets[len(sets)//2-1]
    else:
        (sets[len(sets)//2 - 2] + sets[len(sets)//2 -1]) / 2

其中两个sets表达式是您要添加到结果列表中的值。

可以使用条件表达式折叠if ... else ...语句,允许您将整个事物放入列表解析中:

[sets[len(sets)//2-1] if not len(sets)%2 else (sets[len(sets)//2 - 2] + sets[len(sets)//2 -1]) / 2
 for sets in self._rawdata]

因此,对于循环中的每个sets,您可以根据not len(sets)%2测试生成两个表达式中的一个。

如果您将中位数委托给函数,可能会更容易:

def median(sets):
    if not len(sets) % 2:
        return sets[len(sets)//2-1]
    return (sets[len(sets)//2 - 2] + sets[len(sets)//2 -1]) / 2

并在列表理解中使用它:

[median(sets) for sets in self._rawdata]

更具可读性。