Как отредактировать 2 списка так, чтобы они совпадали в python - PullRequest
0 голосов
/ 08 июля 2020

У меня есть два списка: a и b. Они выглядят так:

a = [
 'And',
 "you're",
 'going',
 'to',
 'use',
 'some',
 'handouts.',
 'Okay.',
 'So',
 'I',
 'needed',
 'to',
 'know',
 'and',
 'for,'
]
b = [
 'And',
 "you're",
 'going',
 'to',
 'use',
 'some',
 'handouts.',
 'Okay.',
 'I',
 'needed',
 'to',
 'know',
 'and',
 'for,',
 'it'
]

Я хочу убедиться, что они могут складываться вместе и совпадать. Однако это не так, как показано здесь:

x = list(zip(a,b))
for i in x:
    print(i)

('And', 'And')
("you're", "you're")
('going', 'going')
('to', 'to')
('use', 'use')
('some', 'some')
('handouts.', 'handouts.')
('Okay.', 'Okay.')
---> ('So', 'I')
('I', 'needed')
('needed', 'to')
('to', 'know')
('know', 'and')
('and', 'for,')
('for,', 'it')

Видно, что a содержит 'So', а b - нет. Чтобы исправить это, я хочу удалить 'So' из a, что приведет к следующему:

('And', 'And')
("you're", "you're")
('going', 'going')
('to', 'to')
('use', 'use')
('some', 'some')
('handouts.', 'handouts.')
('Okay.', 'Okay.')
('I', 'I')
('needed', 'needed')
('to', 'to')
('know', 'know')
('and', 'and')
('for', 'for,')
('it,', 'it')

По сути, слово существует в одном списке, но не в другом списке в общей области индекса. , Я хочу удалить его, независимо от того, находится он в a или b. Я использовал библиотеку fuzzywuzzy для нечеткого сопоставления, которая работает неплохо, но очень медленно. Есть ли более эффективные способы сделать это?

Ответы [ 3 ]

1 голос
/ 08 июля 2020

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

original_a = [ 'And', "you're", 'going' ] # etc
original_b = [ 'And', "you're", 'going' ] # etc
common_a = [x for x in original_a if x in original_b]
common_b = [x for x in original_b if x in original_a]
zipped_result = zip(common_a, common_b)

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

1 голос
/ 08 июля 2020

Идея состоит в том, чтобы удалить из a те элементы, которых нет в b, и наоборот. Использование наборов - способ вычислить это эффективно для больших списков:

a = [
 'And',
 "you're",
 'going',
 'to',
 'use',
 'some',
 'handouts.',
 'Okay.',
 'So',
 'I',
 'needed',
 'to',
 'know',
 'and',
 'for,'
]

b = [
 'And',
 "you're",
 'going',
 'to',
 'use',
 'some',
 'handouts.',
 'Okay.',
 'I',
 'needed',
 'to',
 'know',
 'and',
 'for,',
 'it'
]

set_a = set(a)
set_b = set(b)
remove_a = set_a - set_b
for item in remove_a:
    a.remove(item)
remove_b = set_b - set_a
for item in remove_b:
    b.remove(item)
x = list(zip(a,b))
for item in x:
    print(item)

Печать:

('And', 'And')
("you're", "you're")
('going', 'going')
('to', 'to')
('use', 'use')
('some', 'some')
('handouts.', 'handouts.')
('Okay.', 'Okay.')
('I', 'I')
('needed', 'needed')
('to', 'to')
('know', 'know')
('and', 'and')
('for,', 'for,')
1 голос
/ 08 июля 2020
c = set(a) & set(b)
# if the order does not matter
list(zip(c,c))
# If the order does matter
list(zip([x for x in a if x in c],
         [x for x in b if x in c]))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...