Как сравнить подсписки двух списков как отдельные объекты? - PullRequest
0 голосов
/ 30 марта 2019

У меня есть два массива, каждый из которых имеет несколько подсписков по 3 элемента в каждом.Я пытаюсь сравнить подсписки обоих этих списков как отдельные объекты, а не проверять элементы из подсписка List1 с элементами из подсписка List2.Эти значения извлекаются из листа Excel с использованием df.vaues

Я пытался использовать обычные функции списка Python и использовать вложенные циклы для

arr1:  [['AU002' '000000000037080' 'VB_ADJ']  ['AU002' '000000000037080' 'VB_ADJ']  ['AU002' '000000000039325' 'VB_ADJ']  ['AU002' '000000000039325' 'VB_ADJ']]

arr2:  [['AU002' '000000000037080' 'HUNTER_DOUGLAS']  ['AU002' '000000000037080' 'EXP'] ['AU002' '000000000037080' 'GEN']  ['AU002' '000000000037080' 'VB_ADJ']  ['AU002' '000000000039325' 'EXP']]

Здесь элемент 4 arr1 отсутствует в arr2но с подходами, которые я использовал, я не мог получить правильный вывод

#1.
mask = np.isin (arr1, arr2)
mask

#2.
i=0
for each in arr1:
   j=0
   if(i<3):
       for every in arr2:
           if(j<3):
               if(each[i]==every[j]):
                   print("found",each[i])
            else :
                print("not found",each[i])
        j+=1
i+=1

#3.
for each in arr1:
    for every in arr2:
        if each==every:
            print('found')
        else:
            print('not found')
#4.
result =  all(elem in arr2  for elem in arr1)
if result:
    print('Found')
else:
    print('Not Found')

Ответы [ 5 ]

0 голосов
/ 01 апреля 2019

Я попробовал следующий код: у меня сработало нормально.Спасибо всем за ваши ответы.С наилучшими пожеланиями.

Поскольку функция cmp () недоступна в python 3.x

def cmp(a, b):
    if((a>b) - (a<b) ==0):
        return True
    else:
        pass
flag=0
for i in invoice_temp2:
    for j in val_query2:
        if(cmp(i,i)):
            flag=0
            break
        else:
            flag=1
            continue

if flag==1:
    print('Not Found')
else:
    print('Found')
0 голосов
/ 30 марта 2019

Здесь ниже приведен фрагмент, который поможет

from pandas import DataFrame

arr1 = [['AU002', '000000000037080', 'VB_ADJ'],
        ['AU002', '000000000037080', 'VB_ADJ'],
        ['AU002', '000000000039325', 'VB_ADJ'],
        ['AU002', '000000000039325', 'VB_ADJ']]
arr2 = [['AU002', '000000000037080', 'HUNTER_DOUGLAS'],
        ['AU002', '000000000037080', 'EXP'],
        ['AU002', '000000000037080', 'GEN'],
        ['AU002', '000000000037080', 'VB_ADJ'],
        ['AU002', '000000000039325', 'EXP']]

df1 = DataFrame.from_records(arr1)
df1.columns = ["Col1", "Col2", "Col3"]

df2 = DataFrame.from_records(arr2)
df2.columns = ["Col1", "Col2", "Col3"]

df1['compressed']=df1.apply(lambda x:'%s%s%s' % (x['Col1'],x['Col2'],x['Col3']),axis=1)
df2['compressed']=df2.apply(lambda x:'%s%s%s' % (x['Col1'],x['Col2'],x['Col3']),axis=1)
df1['Success'] = df1['compressed'].isin(df2['compressed']).astype(int)

print(df1)

Вывод:

    Col1             Col2    Col3                  compressed  Success
0  AU002  000000000037080  VB_ADJ  AU002000000000037080VB_ADJ        1
1  AU002  000000000037080  VB_ADJ  AU002000000000037080VB_ADJ        1
2  AU002  000000000039325  VB_ADJ  AU002000000000039325VB_ADJ        0
3  AU002  000000000039325  VB_ADJ  AU002000000000039325VB_ADJ        0
0 голосов
/ 30 марта 2019

Если ваши списки в следующем формате:

a1 = [['AU002' ,'000000000037080' ,'VB_ADJ'],  ['AU002', '000000000037080' ,'VB_ADJ'],  ['AU002', '000000000039325' ,'VB_ADJ'],  ['AU002', '000000000039325' ,'VB_ADJ']]

 b1 = [['AU002' ,'000000000037080' ,'HUNTER_DOUGLAS'] , ['AU002', '000000000037080', 'EXP'] ,['AU002', '000000000037080' ,'GEN'] , ['AU002' ,'000000000037080' ,'VB_ADJ'] , ['AU002', '000000000039325', 'EXP']]

Всего:

[sublist_a1 for sublist_a1 in a1 for sublist_b1 in b1 if sublist_a1 == sublist_b1]

Предоставляет подсписок, присутствующий в обоих списках:

[['AU002', '000000000037080', 'VB_ADJ'],
 ['AU002', '000000000037080', 'VB_ADJ']]
0 голосов
/ 30 марта 2019

Массив numpy может хорошо работать здесь.Подробнее об этом можно прочитать здесь: https://docs.scipy.org/doc/numpy/reference/generated/numpy.array_equal.html

import numpy as np

lis1= [['AU002', '000000000037080', 'VB_ADJ'],  ['AU002', '000000000037080' ,'VB_ADJ'] , ['AU002' ,'000000000039325', 'VB_ADJ'],  ['AU002', '000000000039325', 'VB_ADJ']]
lis2=[['AU002', '000000000037080', 'HUNTER_DOUGLAS'] , ['AU002', '000000000037080', 'EXP'] ,['AU002', '000000000037080' ,'GEN'],  ['AU002' ,'000000000037080' ,'VB_ADJ'] , ['AU002' ,'000000000039325', 'EXP']]

for i in lis1:
    lis=[]
    for j in lis2:
        lis.append(np.array_equal(i,j))
    if True in lis:
        print('Found ', i)
    else:
        print('Not Found ', i)

Выход

Found  ['AU002', '000000000037080', 'VB_ADJ']
Found  ['AU002', '000000000037080', 'VB_ADJ']
Not Found  ['AU002', '000000000039325', 'VB_ADJ']
Not Found  ['AU002', '000000000039325', 'VB_ADJ']
0 голосов
/ 30 марта 2019

Вы можете использовать это:

found_list = [elem in arr2 for elem in arr1]

Тестирование:

arr1 = [['AU002', '000000000037080', 'VB_ADJ'],
        ['AU002', '000000000037080', 'VB_ADJ'],
        ['AU002', '000000000039325', 'VB_ADJ'],
        ['AU002', '000000000039325', 'VB_ADJ']]
arr2 = [['AU002', '000000000037080', 'HUNTER_DOUGLAS'],
        ['AU002', '000000000037080', 'EXP'],
        ['AU002', '000000000037080', 'GEN'],
        ['AU002', '000000000037080', 'VB_ADJ'],
        ['AU002', '000000000039325', 'EXP']]

found_list = [elem in arr2 for elem in arr1]
print (found_list)

Выход:

[True, True, False, False] # Only 0-th and 1-st elems of arr1 are in arr2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...