【问题标题】:Python: comparing three lists and not storing the same number twicePython:比较三个列表而不是两次存储相同的数字
【发布时间】:2017-04-27 22:21:21
【问题描述】:

我有三个列表:

    list1 = [10, 20, 30]
    list2 = [22, 19, 32]
    list3 = [18, 21, 28]

我想过滤每个列表,以便将一个不在 5 位数以内的数字删除到其他两个列表中的另一个数字。但是,我不希望任何数字被使用两次。这是我的代码:

    output1 = []
    output2 = []
    output3 = []

    for i, valuei in enumerate(list1):
        for j, valuej in enumerate(list2):
            for k, valuek in enumerate(list3):
                delta1_2 = list1[i] - list2[j]
                delta2_3 = list2[j] - list3[k]
                if abs(delta1_2) < 5 and abs(delta2_3) < 5:
                    output1.append(valuei)
                    output2.append(valuej)
                    output3.append(valuek)
                    k=k+1
                    break
                else:
                    continue
    print(output1, output2, output3)

但是,我的输出如下所示:

[20, 20, 30] [22, 19, 32] [18, 18, 28]

我希望它像这样出来(我希望“20”只使用一次,然后在 list1 中移动到“30”):

[20, 30] [22, 32] [18, 28]

【问题讨论】:

  • 我不清楚为什么 19 从第二个列表中删除,而 21 从第三个列表中删除。 19 在 22、18 和 21 的 5 以内;并且 21 在 20、22 和 19 的 5 之内。这不应该意味着从输出中删除的唯一数字是 10?
  • 我正在寻找 3 个数字,每个数字都在不同的列表中,彼此相差 5 位以内。我没有将值与同一列表中的其他值进行比较。
  • 我不确定在这种情况下您所要求的(不使用任何数字两次)是否可行。如果 10 不在其他两个列表中的任何数字的 5 位范围内,那么这并不能说明 20 是否在其他两个列表中的任何数字的 5 位范围内。因此,除非您知道每个列表内或列表之间的关系,否则最终您必须使用某些数字两次。
  • 第一个列表中的 20 个、第二个列表中的 19 个和第三个列表中的 21 个都在 5 个以内,并且来自不同的列表。

标签: python for-loop append break enumerate


【解决方案1】:

为此使用“设置”功能:

    output1 = []
output2 = []
output3 = []

for i, valuei in enumerate(list1):
    for j, valuej in enumerate(list2):
        for k, valuek in enumerate(list3):
            delta1_2 = list1[i] - list2[j]
            delta2_3 = list2[j] - list3[k]
            if abs(delta1_2) < 5 and abs(delta2_3) < 5:
                output1.append(valuei)
                output2.append(valuej)
                output3.append(valuek)
                k=k+1
                break
            else:
                continue
print(set(output1), set(output2), set(output3))

【讨论】:

  • 输出现在是 [20,30] [32,19,22] [18,28]。我希望它是 [20,30] [22,32] [18,28]。我希望外部 for 循环在 list1 中的“20”之后迭代到下一个值,因为它在其他两个列表中的每个列表中都找到了一个 5 位数以内的数字。现在代码停留在“20”并循环通过内部两个 for 循环寻找 5 位范围内的更多值。谢谢!
【解决方案2】:

您的要求与您的示例不符...

def within(x, n, ys):
    return any(abs(x - y) < n for y in ys)

def filter(list_in, list_to_compare):
    return [x for x in list_in if within(x, 5, list_to_compare)]

供您输入:

list1 = [10, 20, 30]
list2 = [22, 19, 32]
list3 = [18, 21, 28]

print(filter(list1, list2 + list3))
print(filter(list2, list1 + list3))
print(filter(list3, list1 + list2))

打印:

[20, 30]
[22, 19, 32]
[18, 21, 28]

19 和 21 在 list1 的 20 中的 5 以内,因此不应被过滤掉。

【讨论】:

  • 我希望所有列表都包含相同数量的值。您是正确的,因为 19 和 21 在 20 的 5 之内,但 20 应该已经与 22 和 18 匹配。
  • 这不是您在问题中要求的。
【解决方案3】:

非常感谢我的朋友解决了这个问题。

    list1 = [10, 20, 30]
    list2 = [22, 19, 32]
    list3 = [18, 21, 28]

    output1 = []
    output2 = []
    output3 = []

    keepGoing = True
    matchFound = False
    while(keepGoing):
            matchFound = False
            for i, valuei in enumerate(list1):
                if(matchFound):
                    break
                else:
                    for j, valuej in enumerate(list2):
                            if(matchFound):
                                    break
                            else:
                                    for k, valuek in enumerate(list3):
                                            delta1_2 = list1[i] - list2[j]
                                            delta2_3 = list2[j] - list3[k]
                                            if abs(delta1_2) < 5 and abs(delta2_3) < 5:
                                                    matchFound = True
                                                    output1.append(list1[i])
                                                    output2.append(list2[j])
                                                    output3.append(list3[k])
                                                    list1 = list1[i+1:]
                                                    list2 = list2[j+1:]
                                                    list3 = list3[k+1:]
                                                    if not list1 or not list2 or not list3:
                                                            keepGoing = False
                                                    break

    print((output1), (output2), (output3))

输出:

[20,30] [22,32] [18,28]

【讨论】:

    猜你喜欢
    • 2019-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-23
    • 1970-01-01
    • 2017-09-11
    • 1970-01-01
    • 2017-12-24
    相关资源
    最近更新 更多