Найти подходящие элементы во вложенном списке - PullRequest
0 голосов
/ 10 мая 2018

У меня есть такой вложенный список:

lst = [['one two', 'three', '10'], ['spam eggs', 'spam', '8'],
       ['two three', 'four', '5'], ['foo bar', 'foo', '7'],
       ['three four', 'five', '9']] 

Последний элемент является своего рода вероятностью. Мне нужно найти элементы, в которых второе и третье слова одного элемента соответствуют первому и второму слову другого, например:

['one two', 'three', '10'] match ['two three', 'four', '5'] match  ['three four', 'five', '9']

И сделай цепочки вроде:

one two 10 three 5 four 9 five

Я понимаю, что первым шагом должна быть токинизация элементов:

lst = ([' '.join(x).split() for x in lst])
for i in lst: 
    print(i)

Итак, я получаю

['one', 'two', 'three', '10']
['spam', 'eggs', 'spam', '8']
['two', 'three', 'four', '4']
['foo', 'bar', 'foo', '7']
['three', 'four', 'five', '9']

Следующим шагом должен быть некий итеративный поиск по каждому элементу списка, но я немного застрял в реализации такого поиска в Python. Любая помощь будет оценена.

Ответы [ 4 ]

0 голосов
/ 10 мая 2018

Это работает также:

lst = [['one two', 'three', '10'],['spam eggs', 'spam', '8'], ['two three', 'four', '5'], ['foo bar', 'foo', '7'], ['three four', 'five', '9']] 
lst = ([' '.join(x).split() for x in lst])

match, first = [], True
for i in lst:
    for j in lst:
        if i[0] == j[1] and i[1] == j[2]:
            if first:
                match.append(j)
                first = False
            match.append(i)

for i in match:
    if i == match[len(match)-1]: print(i)
    else: print ("{} match ".format(i), end=' ')

for i in match:
    if i == match[0]: print (i[0], i[1], i[3], end=' ')
    elif i == match[len(match)-1]: print (i[1], i[3], i[2])
    else: print (i[1], i[3], end=' ')

Где первый for i in match контур выводит:

['one', 'two', 'three', '10'] match  ['two', 'three', 'four', '5'] match ['three', 'four', 'five', '9']

И второе:

one two 10 three 5 four 9 five
0 голосов
/ 10 мая 2018

Попробуйте это:

lst = [['one two', 'three', '10'], ['spam eggs', 'spam', '8'],
       ['two three', 'four', '5'], ['foo bar', 'foo', '7'],
       ['three four', 'five', '9']]

lst = [' '.join(x).split() for x in lst]
for i in lst: 
    print(i)

# ---------------------------------------------------------------

st = set()
for i in [set(x) for x in lst]:
    st |= i

print(st)
print(list(st))

Выход:

['one', 'two', 'three', '10']
['spam', 'eggs', 'spam', '8']
['two', 'three', 'four', '5']
['foo', 'bar', 'foo', '7']
['three', 'four', 'five', '9']
{'bar', 'spam', '9', 'one', 'five', 'three', 'two', '8', 'four', '5', 'foo', '10', '7', 'eggs'}
['bar', 'spam', '9', 'one', 'five', 'three', 'two', '8', 'four', '5', 'foo', '10', '7', 'eggs']
0 голосов
/ 10 мая 2018

Я бы предложил использовать панд следующим образом:

import pandas as pd

lst = [['one two', 'three', '10'], ['spam eggs', 'spam', '8'],
   ['two three', 'four', '5'], ['foo bar', 'foo', '7'],
   ['three four', 'five', '9']]

lst = [' '.join(x).split() for x in lst]

#Create a dataframe and merge using the adequate columns

df = pd.DataFrame(lst)
matchedDF = df.merge(df,how='inner',left_on=[1,2],right_on=[0,1],suffixes=['left','right'])

# remove unneccessary columns
cols=matchedDF.columns.tolist()

matchedDF = matchedDF[cols[2:]]

print(matchedDF)

Я получаю:

    0left  1left  2left 3left 0right 1right 2right 3right
0   one    two  three    10    two  three   four      5
1   two  three   four     5  three   four   five      9
0 голосов
/ 10 мая 2018

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

# import itertools
import itertools
# search for the item after generating a chain
item in itertools.chain.from_iterable(lst)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...