удаление замененных словом элементов списка в python - PullRequest
0 голосов
/ 04 декабря 2018

У меня есть список с повторяющимися значениями, которые были заменены.например

dataList=["john is student", "student is john", "john student is", "john is student", "alica is student", "good weather", "weather good"]

Я хочу удалить все эти повторяющиеся значения, как показано:

ожидаемый вывод:

dataList=["john is student","john is student", "john is student","john is student","alica is student", "good weather", "good weather"]

код, который я пытаюсь использовать:

for i in dataList:
    first=(i.split()[0]) +  i.split()[1] + i.split()[2]) in studentList
    ........

Я застрял в формировании логики.Могу ли я узнать, как я могу получить требуемый результат

Ответы [ 4 ]

0 голосов
/ 05 декабря 2018

Вы можете создать словарь seen, хранящий frozenset слов для каждого элемента с первым появлением слов.Вы можете сначала зарегистрировать seen dict и установить или получить старое значение, используя {}.setdefault( ).

dataList= ["john is student", 
           "student is john", 
           "john student is",
           "alica is student",
           "good weather", 
           "weather good",
          ]

seen = {}
data = []
for words in dataList:
    key = frozenset(words.split())
    words = seen.setdefault(key, words)
    data.append(words)

вывод:

>>> data
['john is student',
 'john is student',
 'john is student',
 'alica is student',
 'good weather',
 'good weather']
0 голосов
/ 04 декабря 2018

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

dataList= ["john is student", 
           "student is john", 
           "john student is", 
           "alica is student", 
           "good weather", 
           "weather good",
          ]

filterdData = {}
for statement in dataList:
    filterdData.setdefault(''.join(sorted(statement)), statement)

dataList = filterdData.values() 
print(dataList)

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

0 голосов
/ 04 декабря 2018

@ Grijesh уже дал очень чистое решение, просто повторив свой код -

dataList=["john is student", "student is john", "john student is", 
          "alica is student", "good weather", "weather good"]

final_data = {} 
for i in dataList:
    data[" ".join(sorted(set(i.split())))] = i

Выходные данные

>>>list(final_data.values())
   ['john student is', 'alica is student', 'weather good']

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

Теперь мы сделали из него словарь, мы знаем, что словарь может содержать только уникальные ключи, поэтому он будет хранить только только уникальные наборы (с которыми мы, наконец, сделали строку, выполнив соединение)

0 голосов
/ 04 декабря 2018

Если вы считаете, что первое вхождение является правильным, то, что вам нужно в окончательном списке, тогда вы можете попробовать следующее:

dataList= ["john is student", 
           "student is john", 
           "john student is", 
           "alica is student", 
           "good weather", 
           "weather good",
          ]

data = {}
for words in dataList:
    data.setdefault(frozenset(words.split()), words)

dataList = data.values() 
 # dataList is you need

Редактировать

С момента моего последнего ответа вопрос был обновлен с требованием сохранить повторяющиеся значения.

[Ответ]

dataList= ["john is student", 
           "student is john", 
           "john student is",
           "alica is student",
           "good weather", 
           "weather good",
          ]

class WordFrequence:
    def __init__(self, word, frequence=1):
        self.word = word
        self.frequence = frequence

    def as_list(self):
        return [self.word] * self.frequence

    def __repr__(self):
        return "{}({}, {})".format(self.__class__.__name__, self.word, self.frequence)    

counter = {} 
for words in dataList:
    key = frozenset(words.split())
    if key in counter:
        counter[key].frequence += 1
    else:
        counter[key] = WordFrequence(words)

dataList = [] # this is what you need
for wf in counter.values():
    dataList.extend(wf.as_list())

Для длинного ввода dataList вы можете улучшитьмой код, заменив WordFrequence на recordclass

...