В sed вы можете сделать что-то вроде:
sed -e '1,/audit number/s#audit".*#audit" : [{#' \
-e '/audit number/,$s#"audit"\s*:##' \
-e '{N;s#,\s*"id"#]&#;P;D}' input.txt
, что примерно означает:
Работа с JSON с помощью строковых инструментов очень опасна, поскольку изменения в интервале и порядке, которые не имеют отношения к программам, обменивающимся JSON, испортят этот стиль анализа. Обычно лучше сделать минимальное количество исправлений, чтобы получить действительный JSON, а затем использовать обычные средства JSON на любимом языке программирования.
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
Получить список как выходное использование понимание списка :
common_elements = [x for x in list1 if x in list2]
>>> list1 = [1,2,3,4,5,6]
>>> list2 = [3, 5, 7, 9]
>>> list(set(list1).intersection(list2))
[3, 5]
Решения, предложенные С.Марком и 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 внутри.
использовать набор пересечений, набор (список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']
>>>
>>>
Обратите внимание, что список результатов может иметь другой порядок с исходным списком.