Перемещение нескольких черепах в Python 3.4.3 для создания & ldquo; Tusi Couple & rdquo ;?

Если вы можете написать рекурсивную функцию, которая лучше всего подходит для производительности.

Но если вы хотите пропустить рекурсивный вызов с (для каждого ключа в вложенном объекте), вы можете попробовать JSON.parse с дополнительным параметром (обратный вызов), который будет называться рекурсивно. как обобщенное решение, я добавляю фрагмент (с JSON.parse, предполагая, что помощь в написании рекурсивной функции не должна быть принята / часть этого ответа).

Но помните, ЕСЛИ вы беспокоитесь о производительности эффективность вы не должны использовать это, поскольку вы должны стягивать (может быть большой объект) и снова анализировать. Но если у вас есть строка JSON, это должно быть одним из лучших решений.

var anyObject = [
  {
    "Attr": [
      {
        "power": { "p1": "str", "t3": "str" },
        "light": [
          {"test": "str"},
          {"test2": [ { "t4": "str" }]}
        ]
      }
    ]
  },
  {
    "Attr1": [
      {
        "power1": { "p2": "str", "t5": "str" },
        "light1": [
          { "test3": "str" },
          { "test_x": [
              { "t_x": "str" },
              { "t_y": [
                  { "t_y1": "str" }
                ]
              }
            ]
          }
        ]
      }
    ]
  }
]

function getKeys(obj, str) {
let resultArr = [];
	JSON.parse(JSON.stringify(obj), (key, val) => {
		if(val === str) { resultArr.push(key) }
		return val;
	} )
return resultArr;
}

console.log(getKeys(anyObject, 'str'))

Это не зависит от конкретного случая, вы можете есть все ключи, если вы передадите другой обратный вызов в JSON.parse, а также можете преобразовать объект с помощью этого (возвращаемое преобразованное значение вместо фактического значения)

И если вы хотите использовать lodash для повторного итерации объекта, то вы можете использовать _.cloneDeepWith для рекурсивного итерации объекта.

Вот рабочий пример:

let anyObject = [
  {
    "Attr": [
      {
        "power": { "p1": "str", "t3": "str" },
        "light": [
          {"test": "str"},
          {"test2": [ { "t4": "str" }]}
        ]
      }
    ]
  },
  {
    "Attr1": [
      {
        "power1": { "p2": "str", "t5": "str" },
        "light1": [
          { "test3": "str" },
          { "test_x": [
              { "t_x": "str" },
              { "t_y": [
                  { "t_y1": "str" }
                ]
              }
            ]
          }
        ]
      }
    ]
  }
];

function getKeys(obj, str) {
  let resultArr = [];
  _.cloneDeepWith(obj, (value, key) => { value === 'str' && resultArr.push(key)});
  return resultArr;
}

console.log(getKeys(anyObject, 'str'));
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.10/lodash.min.js"></script>

0
задан cdlane 20 January 2019 в 08:02
поделиться

1 ответ

Питонская черепаха не является демоном скорости, когда дело доходит до анимации. Хитрость в том, чтобы добиться какой-то скорости, - это потратить время, чтобы понять, как это работает, и попросить его сделать как можно меньше. Ниже приведена моя реализация анимированного GIF-изображения «каждый из белых кругов действительно движется»:

from math import pi, cos
from itertools import cycle
from turtle import Screen, Turtle

CIRCLES = 8
DIAMETER = 300
RADIUS = DIAMETER / 2

CURSOR_SIZE = 20

screen = Screen()
screen.tracer(False)

turtle = Turtle(visible=False)
turtle.dot(DIAMETER + CURSOR_SIZE)

turtles = []

for n in range(CIRCLES):
    angle = n * pi / CIRCLES

    circle = Turtle('circle')
    circle.radians()
    circle.color('red')
    circle.penup()

    circle.setheading(angle)  # this stays fixed

    # stash a couple of our values with the turtle
    circle.angle = angle  # this will change
    circle.sign = 1 if cos(angle) > 0 else -1

    turtles.append(circle)

circles = cycle(turtles)

while True:  # really should use timer event but we're going for maximum speed!
    circle = next(circles)

    cosine = cos(circle.angle)
    circle.forward(cosine * RADIUS - circle.sign * circle.distance(0, 0))

    # update the values we stashed with the turtle
    circle.sign = 1 if cosine > 0 else -1
    circle.angle -= 0.1

    screen.update()

screen.tracer(True)
screen.mainloop()

enter image description here

Если вы хотите увидеть линии, на которых круги движутся взад-вперед, добавьте следующий код непосредственно перед строкой turtles = []:

turtle.radians()
turtle.color('white')
for n in range(CIRCLES):
    turtle.setheading(n * pi / CIRCLES)
    turtle.forward(RADIUS)
    turtle.backward(DIAMETER)
    turtle.forward(RADIUS)
0
ответ дан cdlane 20 January 2019 в 08:02
поделиться
Другие вопросы по тегам:

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