Сравнение общих элементов между 2 списками

В sed вы можете сделать что-то вроде:

sed -e '1,/audit number/s#audit".*#audit" : [{#' \
    -e '/audit number/,$s#"audit"\s*:##' \
    -e '{N;s#,\s*"id"#]&#;P;D}' input.txt

, что примерно означает:

  1. между строками 1 и первым «номером аудита», заменяющим А для полей аудита. .
  2. между первым «номером аудита» и концом, заменить поля B для полей аудита.
  3. используйте объединение строк, чтобы найти, [пробел] "id" и вставить ']' перед ним.

Работа с JSON с помощью строковых инструментов очень опасна, поскольку изменения в интервале и порядке, которые не имеют отношения к программам, обменивающимся JSON, испортят этот стиль анализа. Обычно лучше сделать минимальное количество исправлений, чтобы получить действительный JSON, а затем использовать обычные средства JSON на любимом языке программирования.

109
задан Alex.K. 11 September 2018 в 06:17
поделиться

5 ответов

def list_common_elements(l_1,l_2,_unique=1,diff=0):
    if not diff:
        if _unique:
            return list(set(l_1)&set(l_2))
        if not _unique:
            return list((i for i in l_1 if i in l_2))
    if diff:
        if _unique:
            return list(set(l_1)^set(l_2))
        if not _unique:
            return list((i for i in l_1 if i not in l_2))
"""
Example:
l_1=             [0, 1, 2, 3, 3, 4, 5]
l_2=             [6, 7, 8, 8, 9, 5, 4, 3, 2]
look for diff
l_2,l_1,diff=1,_unique=1: [0, 1, 6, 7, 8, 9]        sorted(unique(L_2 not in L_1) + unique(L_1 not in L_2))
l_2,l_1,diff=1,_unique=0: [6, 7, 8, 8, 9]           L_2 not in L_1
l_1,l_2,diff=1,_unique=1: [0, 1, 6, 7, 8, 9]        sorted(unique(L_1 not in L_2) + unique(L_2 not in L_1))
l_1,l_2,diff=1,_unique=0: [0, 1]                    L_1 not in L_2
look for same
l_2,l_1,diff=0,_unique=1: [2, 3, 4, 5]              unique(L2 in L1)
l_2,l_1,diff=0,_unique=0: [5, 4, 3, 2]              L2 in L1
l_1,l_2,diff=0,_unique=1: [2, 3, 4, 5]              unique(L1 in L2)
l_1,l_2,diff=0,_unique=0: [2, 3, 3, 4, 5]           L1 in L2
"""

Эта функция обеспечивает способность сравнить два списка (L_1 по сравнению с L_2). РАЗЛИЧНЫЙ параметр установил сравнение для поиска общих элементов (РАЗНОСТЬ == Верный) или различные элементы (РАЗНОСТЬ == Ложь) между обоими списками. На следующем уровне поведение метода установлено _UNIQUE параметром. _UNIQUE == Верный будет использовать наборы Python †“в этом случае, метод возвращает отсортированный список уникальных элементов, удовлетворяющих РАЗЛИЧНЫЙ, Когда _UNIQUE == Ложь †“возвращенный список будет более явной, т.е. это будет сначала содержать все элементы L_1, сопровождаемого всеми элементами L_2, удовлетворяющего РАЗЛИЧНОЕ. Так как вывод будет содержать повторяющиеся случаи элементов в L_1 и L_2 удовлетворяющая РАЗНОСТЬ, пользователь мог постсчитать количество раз, элемент отличается или распространен между списками. Поскольку это предложение является просто компиляцией кода, предложенного “cowlinator” и J.S Method2, нравится, см. эти сообщения авторов для обсуждения скорости и выполнения вычисления. Кредиты cowlinator и J.S. Method2

0
ответ дан 6 October 2019 в 02:17
поделиться

Получить список как выходное использование понимание списка :

common_elements = [x for x in list1 if x in list2]
-1
ответ дан 24 November 2019 в 03:17
поделиться
>>> list1 = [1,2,3,4,5,6]
>>> list2 = [3, 5, 7, 9]
>>> list(set(list1).intersection(list2))
[3, 5]
214
ответ дан 24 November 2019 в 03:17
поделиться

Решения, предложенные С.Марком и SilentGhost , обычно говорят вам, как это должно быть сделано в Python, но я подумал, что вы также можете извлеките выгоду из понимания того, почему ваше решение не работает. Проблема в том, что как только вы найдете первый общий элемент в двух списках, вы вернете только этот единственный элемент. Ваше решение может быть исправлено путем создания списка результатов и сбора общих элементов в этом списке:

def common_elements(list1, list2):
    result = []
    for element in list1:
        if element in list2:
            result.append(element)
    return result

Еще более короткая версия, использующая понимание списков:

def common_elements(list1, list2):
    return [element for element in list1 if element in list2]

Однако, как я уже сказал, это очень неэффективно способ сделать это - встроенные типы наборов Python намного более эффективны, поскольку они реализованы на C внутри.

31
ответ дан 24 November 2019 в 03:17
поделиться

использовать набор пересечений, набор (список1) и набор (список2)

>>> def common_elements(list1, list2):
...     return list(set(list1) & set(list2))
...
>>>
>>> common_elements([1,2,3,4,5,6], [3,5,7,9])
[3, 5]
>>>
>>> common_elements(['this','this','n','that'],['this','not','that','that'])
['this', 'that']
>>>
>>>

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

26
ответ дан 24 November 2019 в 03:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: