печатать значения в словаре без пустого списка - PullRequest
0 голосов
/ 27 августа 2018

У меня есть следующие данные:

d = d = [ {
  "test" : [ {
    "win" : {
      "number" : 0
    },
    "taken" : [ {
      "id" : "0",
      "library" : [ ]
    } ]
  }, {
    "win" : {
      "number" : 1
    },
    "taken" : [ {
      "id" : "1",
      "library" : [ {
        "takenid" : "2",
        "lib" : "man"
      } ]
    }, {
      "id" : "2",
    } ]
  }, {
    "chunk" : {
      "number" : 2
    },
    "taken" : [ {
      "id" : "3",
      "library" : [ {
        "takenid" : "0",
        "lib" : "woman"
      }, {
        "takenid" : "1",
        "lib" : "ghost"
      }, {
        "takenid" : "4",
        "lib" : "monster"
      } ]
    }, {
      "id" : "4"
    } ]
  } ]
} ]

Я хотел напечатать все значения для словаря "lib", но не пустой список.В моем коде я проверю итоговый «id» и сравню его с «takeid», затем добавлю новый «takeid» на основе пропущенных значений.После этого я хочу создать словарь, который имеет форму этого {id: {takeid: lib}}, но исключая пустой список (недавно добавленные «takeid» и «lib»).

Нижекод моего скрипта:

acom = []
lemmas = []
ordering = []
sort = []      

check = 0
for x in d[0]["test"]:
    for y in x["taken"]:
        if "id" in y:
            check += 1

value = []
#Calculate the number of "takenid"
for x in d[0]["test"]:
    for y in x["taken"]:
        if "library" in y:
            for u in y["library"]:
                value.append(int(u["takenid"]))
#Find the difference between the "id" and "takenid"                
missing = (set(range(check)) - set(value))
missing = list(missing)
#print(missing)

for x in d[0]["test"]:
    for y in x["taken"]:
        if "library" in y:
            y["library"].append({"takenid": "%s" % missing[0], "lib": []})
    break                    
#Create a dictionary                             
for x in d[0]["test"]:
    for y in x["taken"]:
        if "library" in y:
            for u in y["library"]:
                if "[]" not in u["lib"]:
                    #if "[]" not in uu:
                       ordering.append({y["id"]:{u["takenid"]:u["lib"]}})



#print(ordering)

Однако мой код берет пустой список и печатает этот вывод:

Текущий вывод:

[{'0': {'3': []}}, {'1': {'2': 'man'}}, {'3': {'0': 'woman'}}, {'3': {'1': 'ghost'}}, {'3': {'4': 'monster'}}]

Я надеюсь создатьсловарь без пустого списка.Возможно ли это сделать?

Ожидаемый результат:

[ {'1': {'2': 'man'}}, {'3': {'0': 'woman'}}, {'3': {'1': 'ghost'}}, {'3': {'4': 'monster'}}]

Ответы [ 2 ]

0 голосов
/ 27 августа 2018

Короткая альтернатива:

[{baz['id']: {quux['takenid']: quux['lib']}}
    for foo in d
    for k, v in foo.items()
    for bar in v
    for kk, vv in bar.items()
    for baz in vv if 'library' in baz and baz['library']
    for quux in baz['library']
]
# => [{'1': {'2': 'man'}}, {'3': {'0': 'woman'}}, {'3': {'1': 'ghost'}}, {'3': {'4': 'monster'}}]

Здесь if 'library' in baz and baz['library'] проверит, что ключ library существует и не является пустым.

0 голосов
/ 27 августа 2018

возможно "[]" вызвало проблему.изменение "[]" на []

изменение if "[]" not in u["lib"]: на if u["lib"]: сделает всю работу.

Объяснение:

"[]" not in u["lib"] означает 'find substring "[]" in u["lib"]'.но в вашем u["lib"] содержится только строка или пустой список.так что просто оценка значения существует даст вам правильный ответ.

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