Цикл по клавишам трека и переход к соответствующей части структуры цикла - PullRequest
0 голосов
/ 11 июня 2018

My repl

(Различные JSON-файлы для различных случаев использования языка.)

import json

# v = "64457.json" #jp
# v = "35777.json" #en, jp, ro
v = "66622.json" #ge, jp, ro
# v = "50900k.json" #ko
# v = "25364c.json" #ch, en

with open(v) as f:
    data = json.load(f)

track_list = data['discs'][0]['tracks']
langs = ('German', 'French' , 'Korean', 'Chinese')

for x, track in enumerate(track_list):
  for i in track['names']:
    print i, len(track["names"].keys())
    if i not in langs:
      print "NOT I"
      if len(track["names"].keys()) == 3 and i in ('Romaji', 'Japanese', 'English'):
        d = track["names"]["Romaji"]
        s = track["names"]["Japanese"]
        y = track["names"]["English"]
        print '-', x+1, y, d, s
        break
    elif len(track["names"].keys()) == 3 and i in langs and i in ('Romaji', 'Japanese'):
        d = track["names"]["Romaji"]
        s = track["names"]["Japanese"]
        y = track["names"][i]
        print '@', x+1, y, d, s
        break
    elif len(track["names"].keys()) == 2 and i in langs:
      y = track["names"][i]
      e = track["names"]["English"]
      print '+', x+1, y, e
      break
  else:
    print '~', x+1, track["names"].values()[0]

Печатная ошибка

German 3
Japanese 3
NOT I
Traceback (most recent call last):
  File "main.py", line 25, in <module>
    y = track["names"]["English"]
KeyError: 'English'

Что яя пытаюсь сделать

Я пытаюсь перебрать все ключи в track['names'].Как только он нажмет клавишу, которая также находится в кортеже langs, я хочу, чтобы он остановился и перешел к соответствующему разделу в разделе if.Если его нет в кортеже langs, он должен вывести информацию, которая у него есть, особенно если ключи - Eng, Rom, и Jpn.Я думаю, что все циклы сбивают меня с толку.

Ответы [ 2 ]

0 голосов
/ 11 июня 2018

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

track_list = data['discs'][0]['tracks']
langs = ('German', 'French' , 'Korean', 'Chinese')

for x, track in enumerate(track_list):
  # below variable is an int with the number of names the track has
  num_names = len(track["names"].keys())
  # below variable is true if one of the track's names is in a lang language
  name_in_lang_bool = any([lang in langs for lang in track["names"].keys()])
  # below variable is true if one of the track's names is in Romaji or English
  name_english_romaji_bool = any([lang in ("English", "Romaji") for lang in track["names"].keys()])

  # you can combine these variables for various conditionals like so: 
  if name_in_lang_bool and num_names == 3 and name_english_romaji_bool:
    print "this track has three names, one of them is in langs, and one of them is either English OR Romaji"

    # this is how you print out all the track's names: 
    for (language, name) in track["names"].iteritems():
      print "name in", language, "is", name

  # here's another example condition 
  elif name_in_lang_bool and num_names == 2:
    print "this track has two names, one of them is in langs"
    for (language, name) in track["names"].iteritems():
      print "name in", language, "is", name
0 голосов
/ 11 июня 2018

Я думаю, что это может помочь увидеть совсем другой подход к проблеме:

  • У вас есть ключи в track["names"] (я предполагаю, что это словарь)
  • Затем вам нужно
    • ключи, принадлежащие langs, и
    • ключи, не принадлежащие langs

Учтите это:

keys_in_langs = filter(lambda key: key in langs, track["names"].keys())
vice_versa = filter(lambda key: key not in langs, track["names"].keys())

filter применяет лямбда-функцию к каждому элементу в keys, возвращая список, для которого эта анонимная функция возвращает true.Вам это нужно?

...