сравните два списка в python и проверьте их равенство при некоторых условиях - PullRequest
2 голосов
/ 08 ноября 2019

Я новичок в питоне и пандах. Здесь у меня есть следующий фрейм данных, который имеет два списка.

Test             Test1
[1,1,1]          [1,2,2]
[1,2,2]          [1,0,1]
[1,0,0]          [1,1,1]
[2,2,2]          [0,0,2]

В этом фрейме данных я пытаюсь сравнить два списка. Существуют некоторые условия, которые только должны возвращать true. Итак,

Здесь, если любая из сторон имеет 2 0 и 1 положительное значение, а другая сторона имеет одинаковые положительные значения, она должна вернуть True, в противном случае False.

Так В этом случае

[1,0,0]          [1,1,1]    
[2,2,2]          [0,0,2]

Здесь для них обоих это вернет true.

Теперь, что я попробовал, так это

def check_two_zeros_onEither_side(tup1,tup2):
    count_on_previous = tup1.count(0)
    count_on_next = tup1.count(0)
    rem1 = [x for x in tup1 if x != 0]
    rem2 = [x for x in tup2 if x != 0]
    if count_on_previous == 2:
        if all([rem1[0] == rem2[0], rem1[0] == rem2[1]]):

Но здесь я не могу обработать некоторые случаи исключений, такие как,Индекс вне диапазона, как это .. Кто-нибудь может помочь мне с этим? Благодарю. А также как мне этого добиться?

def check_two_zeros_onEither_side(tup1,tup2,ins):
    count_on_previous = tup1.count(0)
    count_on_next = tup2.count(0)
    print(count_on_previous,count_on_next)
    rem1 = [x for x in tup1 if x != 0]
    rem2 = [x for x in tup2 if x != 0]
    print(rem1,rem2,len(tup1),len(tup2))
    if count_on_previous == 2 and len(rem1) == 1 and len(rem2) == 3:
        if all( [rem1[0] == rem2[0], rem1[0] == rem2[1], rem1[0] == rem2[2]]):
            print("GOin insde one",ins)
            return True
    elif count_on_next == 2 and len(rem2) == 1 and len(rem1) == 3:
        if all([rem2[0] == rem1[0], rem2[0] == rem1[1], rem2[0] == rem1[2]]):
            print("GOin insde two",ins)
            return True
        else:
            return False
    else:
        return False

Это то, что я пытался .. Работает, но есть ли другой способ сделать это?

1 Ответ

0 голосов
/ 08 ноября 2019

Как насчет следующего

def compare(a, b):
    # Ensure there are two zeros on either side
    if a.count(0) == 2 or b.count(0) == 2:
        # Compute the intersection and ensure it's not zero
        return len(set(a).intersection(b)) is not 0
    return False

Вот тесты для него с использованием Pytest.

import pytest

class TestDataframes:

    def test_frame_a_contains_two_zeros(self):
        a = [0, 0 ,1]
        b = [1, 1, 1]

        assert compare(a, b) is True


    def test_frame_b_contains_two_zeros(self):
            a = [2, 2, 2]
            b = [0, 0, 2]

            assert compare(a, b) is True

    def test_both_frames_contains_two_zeros(self):
            a = [0, 0, 2]
            b = [0, 0, 2]

            assert compare(a, b) is True

    def test_neither_contain_two_zeros(self):
            a = [0, 1, 2]
            b = [0, 1, 2]

            assert compare(a, b) is False

    def test_positive_number_doesnt_match(self):
            a = [2, 2, 2]
            b = [0, 0, 1]

            assert compare(a, b) is False

Функция compare вернет следующее.

[0, 0 ,1] [1, 1, 1] #=> True
[2, 2, 2] [0, 0, 2] #=> True
[0, 0, 2] [0, 0, 2] #=> True
[0, 1, 2] [0, 1, 2] #=> False
[0, 2, 2] [0, 0, 1] #=> False
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...