Python 检查值是否已在列表中

Python 检查值是否已在列表中,python,Python,我正在从3个值的差中生成一个平均值,并希望将其放在列表中 我想要平均的列表示例如下所示: ... [6.0, 270.0, -55.845848680633168], [6.0, 315.0, -47.572000492889323], [6.5, 0.0, -47.806802767243724], [6.5, 45.0, -48.511643275159528], [6.5, 90.0, -45.002053150122123], [6.5, 135.0, -51.0346567020504

我正在从3个值的差中生成一个平均值,并希望将其放在列表中

我想要平均的列表示例如下所示:

...
[6.0, 270.0, -55.845848680633168],
[6.0, 315.0, -47.572000492889323],
[6.5, 0.0, -47.806802767243724],
[6.5, 45.0, -48.511643275159528],
[6.5, 90.0, -45.002053150122123],
[6.5, 135.0, -51.034656702050455],
[6.5, 180.0, -53.266356523649002],
[6.5, 225.0, -47.872632929518339],
[6.5, 270.0, -52.09662072002746],
[6.5, 315.0, -48.563996448937075]]
在前两列匹配的地方,最多会有3行(这两列是极坐标),在这种情况下,我想取第三个元素之间的差,求平均值,并将点的极坐标和平均结果附加到一个新列表中

for a in avg_data:
    comparison = []
    for b in avg_data:
        if a[0] == b[0] and a[1] == b[1]:
            comparison.append(b[2])

    print comparison    
    z = 0   # reset z to 0, z does not need set now in if len(comp) == 1

    if len(comparison) == 2: # if there are only 2 elements, compare them
        z += -(comparison[0]) + comparison[1]
    if len(comparison) == 3: # if all 3 elements are there, compare all 3
        z += -(comparison[0]) + comparison[1]
        z += -(comparison[0]) + comparison[2]
        z += -(comparison[1]) + comparison[2]
        z = z/3 #average the variation

    avg_variation.append([a[0], a[1], z]) #append the polar coordinates and the averaged variation to a list
这段代码将正确的数据输出到列表中,但每次遇到匹配的极坐标时都会输出数据,因此我会得到重复的行

为了停止这种情况,我尝试实现一个if语句,在再次执行平均之前,在avg_变化列表中查找匹配的极坐标

if a[0] not in avg_variation and a[1] not in avg_variation:
这不起作用,我得到了错误

ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
我不认为任何或全部是我要寻找的,因为我只想检查前两列,而不是第三列与已经附加的值。有人知道我怎样才能使我的if陈述更好吗

为了进一步澄清我的实际问题:

我的代码在嵌套列表中搜索前两个元素匹配的列表,对第三个元素执行计算,然后将它们附加到新列表中。我的问题是,如果有2或3行前2个元素匹配,它会将结果附加到新列表中2或3次,我希望它只执行一次


编辑:很抱歉,我最初的问题误导了我代码的目的

您尚未提供确保这一点所需的所有信息,但我相信您的错误是由于在numpy阵列上执行逻辑操作造成的。注意一个有类似错误的问题


如果没有更多信息,很难复制问题的上下文来尝试它,但是在
if
语句中的布尔运算中更具体一些可能会有所帮助。

您没有提供确保这一点所需的所有信息,但我相信您的错误是由于在numpy阵列上执行逻辑操作造成的。注意一个有类似错误的问题


如果没有更多的信息,很难复制问题的上下文来尝试它,但是在
if
语句中的布尔运算中更具体一些可能会有所帮助。

IIUC,我认为更简单的方法是

import numpy as np
from itertools import combinations
from collections import defaultdict

def average_difference(seq):
    return np.mean([j-i for i,j in combinations(seq, 2)]) if len(seq) > 1 else 0

def average_over_xy(seq, fn_to_apply):
    d = defaultdict(list)
    for x,y,z in seq:
        d[x,y].append(z)

    outlist = [[x,y,fn_to_apply(z)] for (x,y),z in sorted(d.items())]
    return outlist
它在所有行上循环,生成一个字典,其中x,y坐标是元素的键和值列表,然后将该字典转换为列表的排序列表,在
z
中的元素中应用指定的函数。例如,我们可以使用平均有符号差和有序差,如在代码中:

产生

>>> seq = [[1, 2, 30], [1, 2, 40], [1, 2, 50], [1, 3, 4], [1, 3, 6], [2, 10, 5]] 
>>> average_over_xy(seq, average_difference)
[[1, 2, 13.333333333333334], [1, 3, 2.0], [2, 10, 0]]
请注意,您定义它的方式,我在上面匹配了,答案取决于元素的顺序,即

>>> average_over_xy([[1,2,3],[1,2,4]], average_difference)
[[1, 2, 1.0]]
>>> average_over_xy([[1,2,4],[1,2,3]], average_difference)
[[1, 2, -1.0]]
如果你想,你可以使用

def average_difference_sorted(seq):
    return average_difference(sorted(seq))
取而代之,或者使用标准偏差或任何你喜欢的东西。(您没有提到您的用例,所以我假设您已经按照您想要的顺序获得了列表,您已经意识到了陷阱,并且您确实需要
平均差异


我们可以做一些更快的基于
numpy
的技巧,以及推广它的方法,但是使用
defaultdict
来累积值是一种方便的模式,而且通常速度足够快。

IIUC,我认为更简单的方法是

import numpy as np
from itertools import combinations
from collections import defaultdict

def average_difference(seq):
    return np.mean([j-i for i,j in combinations(seq, 2)]) if len(seq) > 1 else 0

def average_over_xy(seq, fn_to_apply):
    d = defaultdict(list)
    for x,y,z in seq:
        d[x,y].append(z)

    outlist = [[x,y,fn_to_apply(z)] for (x,y),z in sorted(d.items())]
    return outlist
它在所有行上循环,生成一个字典,其中x,y坐标是元素的键和值列表,然后将该字典转换为列表的排序列表,在
z
中的元素中应用指定的函数。例如,我们可以使用平均有符号差和有序差,如在代码中:

产生

>>> seq = [[1, 2, 30], [1, 2, 40], [1, 2, 50], [1, 3, 4], [1, 3, 6], [2, 10, 5]] 
>>> average_over_xy(seq, average_difference)
[[1, 2, 13.333333333333334], [1, 3, 2.0], [2, 10, 0]]
请注意,您定义它的方式,我在上面匹配了,答案取决于元素的顺序,即

>>> average_over_xy([[1,2,3],[1,2,4]], average_difference)
[[1, 2, 1.0]]
>>> average_over_xy([[1,2,4],[1,2,3]], average_difference)
[[1, 2, -1.0]]
如果你想,你可以使用

def average_difference_sorted(seq):
    return average_difference(sorted(seq))
取而代之,或者使用标准偏差或任何你喜欢的东西。(您没有提到您的用例,所以我假设您已经按照您想要的顺序获得了列表,您已经意识到了陷阱,并且您确实需要
平均差异


我们可以做一些更快的基于
numpy
的技巧,以及推广它的方法,但是使用
defaultdict
来累积值是一种方便的模式,而且通常速度足够快。

这里有一个可能的解决方案:

l=[[6.0, 270.0, -55.845848680633168],
[6.0, 315.0, -47.572000492889323],
[6.5, 0.0, -47.806802767243724],
[6.0, 180.0, -53.266356523649002],
[6.0, 225.0, -47.872632929518339],
[6.0, 270.0, -52.09662072002746],
[6.0, 315.0, -48.563996448937075]]

# First, we change the structure so that the pair of coordinates
# becomes a tuple which can be used as dictionary key
l=[[(c1, c2), val] for c1, c2, val in l]

# We build a dictionary coord:[...list of values...]
d={}
for coord, val in l:
    d.setdefault(coord,[]).append(val)

# Here, I compute the mean of each list of values.
# Apply your own function !

means = [[coord[0], coord[1], sum(vals)/len(vals)] for coord, vals in d.items()]

print means

以下是一个可能的解决方案:

l=[[6.0, 270.0, -55.845848680633168],
[6.0, 315.0, -47.572000492889323],
[6.5, 0.0, -47.806802767243724],
[6.0, 180.0, -53.266356523649002],
[6.0, 225.0, -47.872632929518339],
[6.0, 270.0, -52.09662072002746],
[6.0, 315.0, -48.563996448937075]]

# First, we change the structure so that the pair of coordinates
# becomes a tuple which can be used as dictionary key
l=[[(c1, c2), val] for c1, c2, val in l]

# We build a dictionary coord:[...list of values...]
d={}
for coord, val in l:
    d.setdefault(coord,[]).append(val)

# Here, I compute the mean of each list of values.
# Apply your own function !

means = [[coord[0], coord[1], sum(vals)/len(vals)] for coord, vals in d.items()]

print means

因此,为了澄清问题,结果列表的第三个数字应该是相同的(应该是上面第三列的平均值)?结果列表应该有嵌套列表,第一个和第二个元素是极坐标,第三个元素是这些极坐标值的平均值。在结果列表中,每一行都应该有唯一的极坐标。@markmcmurray:您的代码不会计算值的平均值,但是,它会计算元素之间的平均(有符号)差,这是不同的。是的,你说得对,我的错。我忘了我也这么做了,因为我也在平均这些值,但我将结束我的问题来提及这一点。编辑以更准确地反映代码。因此,为了弄清楚,结果列表的第三个数字(应该是上面第三列的平均值)都应该具有相同的值?结果列表应具有嵌套列表,其第一和第二个元素为极坐标,第三个元素为这些极坐标值的平均值。在结果列表中,每一行都应该有唯一的极坐标。@markmcmurray:您的代码不会计算值的平均值,但是,它会计算元素之间的平均(有符号)差,这是不同的。是的,你说得对,我的错。我忘了我也在这样做,因为我也在平均值,但我会的