#python #list
#python #Список
Вопрос:
Мой список содержит предложения. Есть предложения, которые можно повторять, и есть предложения, которые находятся внутри некоторых других предложений. Например:
- «Гетероциклические соединения»
- «Гетероциклические соединения, содержащие кислород»
Номер 1 находится внутри номера 2, поэтому мне нужно сохранить только уникальный номер, который является номером 2.
Часть моего списка:
['HUMAN NECESSITIES',
'MEDICAL OR VETERINARY SCIENCE; HYGIENE',
'PREPARATIONS FOR MEDICAL, DENTAL, OR TOILET PURPOSES',
'Medicinal preparations containing organic active ingredients',
'Heterocyclic compounds',
'Heterocyclic compounds having oxygen as the only ring hetero atom, e.g. fungichromin',
'Heterocyclic compounds having oxygen as the only ring hetero atom, e.g. fungichromin having six-membered rings with one oxygen as the only ring hetero atom',
'Heterocyclic compounds having oxygen as the only ring hetero atom, e.g. fungichromin having six-membered rings with one oxygen as the only ring hetero atom condensed with carbocyclic rings, e.g. cannabinols, methantheline',
'HUMAN NECESSITIES',
'MEDICAL OR VETERINARY SCIENCE; HYGIENE',
'PREPARATIONS FOR MEDICAL, DENTAL, OR TOILET PURPOSES',
'Medicinal preparations containing organic active ingredients',
'Hydroxy compounds, e.g. alcohols; Salts thereof, e.g. alcoholates',
'Phenols',
'HUMAN NECESSITIES',
'MEDICAL OR VETERINARY SCIENCE; HYGIENE',
'PREPARATIONS FOR MEDICAL, DENTAL, OR TOILET PURPOSES',
'Medicinal preparations containing organic active ingredients',
'Acids; Anhydrides, halides or salts thereof, e.g. sulfur acids, imidic, hydrazonic, hydroximic acids',
'Carboxylic acids, e.g. valproic acid',
'Carboxylic acids, e.g. valproic acid having an amino group',
'Carboxylic acids, e.g. valproic acid having an amino group the amino and the carboxyl groups being attached to the same acyclic carbon chain, e.g. gamma-aminobutyric acid [GABA], beta-alanine, epsilon-aminocaproic acid, pantothenic acid',
'Alpha-aminoacids, e.g. alanine, edetic acids [EDTA]']
Я смог удалить повторения, используя
set(my_list)
Или даже с помощью (для получения ключей из словаря результатов)
from collections import Counter
Counter(my_list)
Но я понятия не имею, как удалить значения, которые находятся внутри других значений. Помогите мне, пожалуйста, с этим вопросом!
Комментарии:
1. вы можете создать 2 вложенных цикла в списке, и для каждой строки, которую вы сравниваете с другой, вы отслеживаете самый длинный, сохраняя результаты для каждой строки
2. Как бы вы это сделали, используя ручку и бумагу?
3. Я бы повторил итерацию в обратном направлении, чтобы сначала сохранить самое длинное, а затем отбросить все более короткие, вместо того, чтобы принимать решение сохранить короткое, отбросить его, заменить более длинным.
Ответ №1:
Вы можете создать 2 вложенных цикла в списке, и для каждой строки, которую вы сравниваете с другой, вы отслеживаете самый длинный, сохраняя результаты для каждой строки. Это может быть не оптимальным решением, если у вас большие данные
Код
currect_list=['HUMAN NECESSITIES',
'MEDICAL OR VETERINARY SCIENCE; HYGIENE',
'PREPARATIONS FOR MEDICAL, DENTAL, OR TOILET PURPOSES',
'Medicinal preparations containing organic active ingredients',
'Heterocyclic compounds',
'Heterocyclic compounds having oxygen as the only ring hetero atom, e.g. fungichromin',
'Heterocyclic compounds having oxygen as the only ring hetero atom, e.g. fungichromin having six-membered rings with one oxygen as the only ring hetero atom',
'Heterocyclic compounds having oxygen as the only ring hetero atom, e.g. fungichromin having six-membered rings with one oxygen as the only ring hetero atom condensed with carbocyclic rings, e.g. cannabinols, methantheline',
'HUMAN NECESSITIES',
'MEDICAL OR VETERINARY SCIENCE; HYGIENE',
'PREPARATIONS FOR MEDICAL, DENTAL, OR TOILET PURPOSES',
'Medicinal preparations containing organic active ingredients',
'Hydroxy compounds, e.g. alcohols; Salts thereof, e.g. alcoholates',
'Phenols',
'HUMAN NECESSITIES',
'MEDICAL OR VETERINARY SCIENCE; HYGIENE',
'PREPARATIONS FOR MEDICAL, DENTAL, OR TOILET PURPOSES',
'Medicinal preparations containing organic active ingredients',
'Acids; Anhydrides, halides or salts thereof, e.g. sulfur acids, imidic, hydrazonic, hydroximic acids',
'Carboxylic acids, e.g. valproic acid',
'Carboxylic acids, e.g. valproic acid having an amino group',
'Carboxylic acids, e.g. valproic acid having an amino group the amino and the carboxyl groups being attached to the same acyclic carbon chain, e.g. gamma-aminobutyric acid [GABA], beta-alanine, epsilon-aminocaproic acid, pantothenic acid',
'Alpha-aminoacids, e.g. alanine, edetic acids [EDTA]']
final_resut_list=[]
for i in range(0,len(currect_list)):
current_str=currect_list[i]
for j in range (i 1,len(currect_list)):
if current_str in currect_list[j] and len(currect_list[j])> len(current_str):
current_str= currect_list[j]
if current_str not in final_resut_list:
final_resut_list.append(current_str)
for res in final_resut_list:
print(res)
конечный результат будет
HUMAN NECESSITIES
MEDICAL OR VETERINARY SCIENCE; HYGIENE
PREPARATIONS FOR MEDICAL, DENTAL, OR TOILET PURPOSES
Medicinal preparations containing organic active ingredients
Heterocyclic compounds having oxygen as the only ring hetero atom, e.g. fungichromin having six-membered rings with one oxygen as the only ring hetero atom condensed with carbocyclic rings, e.g. cannabinols, methantheline
Hydroxy compounds, e.g. alcohols; Salts thereof, e.g. alcoholates
Phenols
Acids; Anhydrides, halides or salts thereof, e.g. sulfur acids, imidic, hydrazonic, hydroximic acids
Carboxylic acids, e.g. valproic acid having an amino group the amino and the carboxyl groups being attached to the same acyclic carbon chain, e.g. gamma-aminobutyric acid [GABA], beta-alanine, epsilon-aminocaproic acid, pantothenic acid
Alpha-aminoacids, e.g. alanine, edetic acids [EDTA]
Ответ №2:
Итак, несколько вещей:
- Вы не до конца продумали эту проблему, что произойдет, если возникнет такой случай:
HUMAN NECESSITIES
HUMAN WORKS
вы хотите сначала показать другое, оба?
Несмотря на это, я пошел с предположением, что вы хотите оба. Я реализовал свое решение с использованием рекурсии, но, как вы видели, мы можем сделать это с помощью нескольких циклов.
from collections import defaultdict
def minimize(sentences):
word_to_sentence = defaultdict(set)
for s in sentences:
words = s.split(' ')
if len(words[1:]) > 0:
word_to_sentence[words[0]].add(" ".join(words[1:]))
out = []
for k, values in word_to_sentence.items():
if len(values) > 1:
for min_val in minimize(values):
out.append(k ' ' min_val)
else:
out.append(k ' ' list(values)[0])
return out
print(minimize(data))