Сопоставление каждого элемента в списке с каждым элементом в списке, используя Python - PullRequest
0 голосов
/ 05 сентября 2018

Я пытаюсь найти наиболее эффективный способ сопоставления каждого элемента в Списке с каждым элементом в Списке Списков, используя Python. Например, для ввода:

>>>myList = [['hi', 'no', 'bye', 'Global', 24],['morning', 'X', 'place'],['so', 'large', 'mall','test'], ['hi', 'X', 'place', 'bye']]
>>>check_against_myLIst = ['bye','place','hi','australia']

Теперь я не уверен, что наилучшим способом было бы использовать функцию карты для циклов или любую другую методологию анализа данных Python.

Выходные данные должны быть преобразованы в информационный фрейм, такой, чтобы Выходные данные были.

Index   Value                                      Result
0       ['hi', 'no', 'bye', 'Global', 24]          True
1       ['morning', 'X', 'place']                  True
2       ['so', 'large', 'mall','test']             False
3       ['hi', 'X', 'place', 'bye']                True

Спасибо!

Ответы [ 4 ]

0 голосов
/ 05 сентября 2018

Здесь у вас есть пример того, как вы можете получить его без использования панд. В любом случае, позвольте мне объяснить другую точку зрения:

# list
my_list = (['hi', 'no', 'bye', 'Global', 24],['morning', 'X', 'place'],['so', 'large', 'mall','test','TESSTTTT'], ['hi', 'X', 'place', 'bye'])

# check list
check_against_myLIst = ('bye','place','hi','australia')

# Function to find intersection of two arrays
def interSection(index, arr1,arr2):
    result = 'false'
    output = list(filter(lambda x: x in arr1, arr2))
    if output:
        result = 'true'

    print 'index',"\t"*1,'Value',"\t"*6,'Result'
    print index,"\t"*1,arr1,"\t"*4,result
    print  ''

# Driver program
if __name__ == "__main__":
    count = 0
    for arrayItem in my_list:
        interSection(count, arrayItem,check_against_myLIst)
        count += 1
0 голосов
/ 05 сентября 2018

Вы можете создать функцию, которая проверяет пересечения между наборами вашего списка и сравниваемым списком.

С учетом

import pandas as pd


cmp = ["bye","place","hi","australia"]
lst = [
    ["hi", "no", "bye", "Global", 24],
    ["morning", "X", "place"],
    ["so", "large", "mall","test"], 
    ["hi", "X", "place", "bye"]
]

Код

def is_in(nested, compare):
    """Return a tuple of (row, bool), True if the compared list intersects."""
    compared = set(compare)
    return [(x, bool(set(x) & compared)) for x in nested]

bool_lst = is_in(lst, cmp)
bool_lst

выход

[(['hi', 'no', 'bye', 'Global', 24], True),
 (['morning', 'X', 'place'], True),
 (['so', 'large', 'mall', 'test'], False),
 (['hi', 'X', 'place', 'bye'], True)]

Это похоже на ваш вывод. Отсюда нам просто нужно создать DataFrame:

df = pd.DataFrame(bool_lst, columns=["Value", "Result"])
df.rename_axis("Index")

выход

enter image description here

Последнее может быть сведено к одной строке:

pd.DataFrame([(x, bool(set(x) & set(cmp))) for x in lst], columns=["Value", "Result"]).rename_axis("Index")
0 голосов
/ 05 сентября 2018

Сначала создайте наборы из myList для теста членства O (1).

>>> myList = [['hi', 'no', 'bye', 'Global', 24],['morning', 'X', 'place'],['so', 'large', 'mall','test'], ['hi', 'X', 'place', 'bye']]
>>> checks = ['bye','place','hi','australia'] # renamed from check_against_myLIst
>>> sets = map(set, myList)

Используйте эффективные any проверки, чтобы выяснить, есть ли какой-либо элемент checks в данном наборе. (В отличие от вычисления пересечений, any ленив.)

>>> result = [(lst, any(s in set_ for s in check)) for lst, set_ in zip(myList, sets)]

Построить фрейм данных.

>>> df = pd.DataFrame(result, columns=['Value', 'Result'])
>>> df.index.name = 'Index'
df

                           Value  Result
Index                                   
0      [hi, no, bye, Global, 24]    True
1            [morning, X, place]    True
2        [so, large, mall, test]   False
3            [hi, X, place, bye]    True
0 голосов
/ 05 сентября 2018

Вы можете просто сохранить результат в списке и построить из этого кадра данных

result = [False]*len(myList)
for n, _list in enumerate(myList):
    if [i for i in _list if i in check_against_myLIst]:
        result[n] = True
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...