Понимание строкового реверсирования через разрезание

для тех, кто может искать альтернативы, вот решение, основанное на jtc и стандартных утилитах Unix:

1. сначала рассортируем все уникальные code:

bash $ jtc -w'l:' file.json | sort -u 
"AAA"
"BBB"
bash $

2. затем передайте каждое значение через xargs - jtc, чтобы объединить каждую запись с помощью name (применяя результат на месте, переключите -f). Примечание: ниже опция xarg -t дана только для демонстрационных целей и на самом деле не требуется:

bash $ jtc -w'l:' file.json | sort -u | xargs -L1 -I{} -t jtc -w"[code]:<{}>[-1][name]" -mi'[code]:<{}>1:[-1][name]' -f file.json
jtc -w[code]:[-1][name] -mi[code]:1:[-1][name] -f file.json
jtc -w[code]:[-1][name] -mi[code]:1:[-1][name] -f file.json
bash $ 

3. наконец удалите все объединенные записи:

bash $ jtc -w'l:' file.json | sort -u | xargs -L1 -I{} -t jtc -w"[code]:<{}>1: [-1]" -p -f file.json
jtc -w[code]:1: [-1] -p -f file.json
jtc -w[code]:1: [-1] -p -f file.json
bash $ 

file.json теперь содержит желаемый результат:

bash $ cat file.json
[
   {
      "code": "AAA",
      "latitude": 11,
      "longitude": 22,
      "name": [
         "person 1",
         "person 2"
      ]
   },
   {
      "code": "BBB",
      "latitude": 33,
      "longitude": 44,
      "name": [
         "person 3",
         "person 4"
      ]
   }
]
bash $ 

***, если вы хотите переименовать метку name в people применить дополнительный шаг:

bash $ jtc -w'l: <>v' -u'"people"' file.json 
[
   {
      "code": "AAA",
      "latitude": 11,
      "longitude": 22,
      "people": [
         "person 1",
         "person 2"
      ]
   },
   {
      "code": "BBB",
      "latitude": 33,
      "longitude": 44,
      "people": [
         "person 3",
         "person 4"
      ]
   }
]
bash $ 

jtc руководство пользователя можно найти здесь: https://github.com/ldn-softdev/jtc/blob/master/User%20Guide.md [ +1117]

34
задан martineau 19 July 2019 в 14:26
поделиться

8 ответов

Конечно, [::] является оператором расширенного среза , Это позволяет вам брать подстроки. По сути, он работает, определяя, какие элементы вы хотите, как [begin: end: step], и работает для всех последовательностей. Об этом есть две полезные вещи:

  • Вы можете опустить один или несколько элементов, и это делает «правильную вещь»
  • Отрицательные числа для начала, конца и шага имеют значение

Для начала и конца, если вы дать отрицательное число, это означает, что считать с конца последовательности. Например, если у меня есть список:

l = [1,2,3]

Тогда l [-1] равно 3, l [-2] равно 2 и l [-3] равно 1.

Для аргумента step отрицательное число означает работу в обратном направлении через последовательность. Так что для списка ::

l = [1,2,3,4,5,6,7,8,9,10]

Вы можете написать l [:: -1] , что в основном означает использование шага размером -1 при чтении списка. Python будет «делать правильные вещи» при заполнении start и stop, поэтому он перебирает список в обратном направлении и дает вам [10,9,8,7,6,5,4,3,2,1] .

Я привел примеры со списками, но строки - это просто другая последовательность и работают так же. Итак, a [:: - 1] означает создание строки путем объединения символов, которые вы получаете, проходя назад по строке.

но строки - это просто другая последовательность и работают так же. Итак, a [:: - 1] означает создание строки путем объединения символов, которые вы получаете, проходя назад по строке.

но строки - это просто другая последовательность и работают так же. Итак, a [:: - 1] означает создание строки путем объединения символов, которые вы получаете, проходя назад по строке.

73
ответ дан 27 November 2019 в 16:09
поделиться

строка - это, по сути, последовательность символов, поэтому с ней работает операция среза. То, что вы делаете, на самом деле:

-> получить часть «а» от начала до конца с шагом 1 назад.

1
ответ дан 27 November 2019 в 16:09
поделиться

Используется расширенное срезание - строка в Python является последовательностью, и разделяет некоторые методы с другими последовательностями (а именно списками и кортежами). Нарезка состоит из трех частей - начало, остановка и шаг. Все они имеют значения по умолчанию - начальные значения по умолчанию равны 0, конечные значения по умолчанию равны len (sequence), а значение шага по умолчанию равно 1. Указывая [:: - 1], вы говорите «все элементы в последовательности a, начиная с начала до конца, возвращаясь назад по одному.

Эта функция была введена в Python 2.3.5, и вы можете прочитать больше в Что нового в документах .

2
ответ дан 27 November 2019 в 16:09
поделиться

[:: - 1] дает фрагмент строки a. полный синтаксис: a [begin: end: step] который дает [начало], [начало + шаг], ... а [конец-1]. Когда шаг отрицательный, вы начинаете с конца и переходите к началу.

Наконец, начинаются значения по умолчанию с начала последовательности, с конца до конца и с шагом -1.

2
ответ дан 27 November 2019 в 16:09
поделиться

Это расширенная нотация :

sequence[start:end:step]

В в этом случае шаг -1 означает задом наперед, а пропуск начала и конца означает, что вам нужна вся строка.

3
ответ дан 27 November 2019 в 16:09
поделиться

Это называется нотация слайсов в Python, и вы можете прочитать немного больше о том, как это работает здесь:

Объяснить нотацию среза Python

2
ответ дан 27 November 2019 в 16:09
поделиться

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

for char in reversed( myString ):  
  print( char, end = "" )
6
ответ дан 27 November 2019 в 16:09
поделиться

Часть "-1" представляет часть "шага" среза - в этом случае она проходит через строка 1 символ за раз, но в обратном направлении (отрицательный шаг означает начало с конца строки). Например, если указать шаг равным 2, вы получите все остальные символы строки, начиная с первого. Если вы укажете шаг -2, вы получите все остальные символы строки, начиная с последнего символа и работая в обратном направлении.

Итак, в двух словах, если a = '12345' :

  • a [:: 2] становится 135
  • a [:: - 1] становится 54321
  • a [:: - 2] становится 531
7
ответ дан 27 November 2019 в 16:09
поделиться
Другие вопросы по тегам:

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