簡體   English   中英

在 JSON 輸入中查找給定列表的頂部項目列表的函數

[英]Function to find top list of items for a given list in a JSON input

我有一個這樣的數據框:

| json_col                                           |
| ---------------------------------------------------|
| {"category":"a","items":["a","b","c","d","e","f"]} |
| {"category":"b","items":["u","v","w","x","y"]}     |
| {"category":"c","items":["p","q"]}                 |
| {"category":"d","items":["m"]}                     |

我將其轉換為字典字符串:

x = pd.Series(', '.join(df_list['json_col'].to_list()), name='text')

結果如下:

'{"category":"a","items":["a","b","c","d","e","f"]},
{"category":"b","items":["u","v","w","x","y"]},
{"category":"c","items":["p","q"]},
{"category":"d","items":["m"]}'

(編輯:這是我發布問題時的原始輸入,但有人指出這不是使用 JSON 的正確方法,因此我提供了上面的數據框。)

我需要編寫一個 python 函數,它將一個項目作為輸入,並從它所屬的列表中返回前 3 個項目(不包括它自己)。 項目按優先級順序排列,因此前 3 項是最先出現的項目。

def item_list(above_json_input, item = "a"):
    return list

例如,結果列表應遵循以下規則:

  1. 如果項目是“a”,則遍歷類別 - a 存在項目 a 並返回序列中的前 3 個項目 - ["b","c","d"]
  2. 如果項目是“w”,則遍歷類別 - b,其中項目 w 在那里並返回 - [“u”,“v”,“x”]
  3. 如果項目是“q”,則查看類別 - c,其中項目 q 在那里並返回 - [“p”],因為除了 q 之外還有少於 3 個頂部項目
  4. 如果項目是“m”,則返回的列表應該在類別 d 中查找項目 q 並返回空 [],因為該列表中沒有其他項目可以查找頂部項目。

不存在的項目也是如此,例如 item = "r" 不存在於任何類別中。 我們可以拋出錯誤或再次返回一個空列表。

我不確定如何閱讀 json 並獲取頂級項目列表。 這甚至可能嗎?

我修復了您的 JSON,因為它的格式不正確。 對於輸入“c”,將打印['a', 'b', 'd']['p', 'q']

import json

data_string = """{
        "data" : [
                {"category":"a","items":["a","b","c","d","e","f"]},
                {"category":"b","items":["u","v","w","x","y"]},
                {"category":"c","items":["p","q"]},
                {"category":"d","items":["m"]}
        ]
}"""

data = json.loads(data_string)["data"]

user_input = input("Pick a letter: ")

found = False
for values in data:
        if user_input in (values["category"], *values["items"]):
                found = True
                temp = [item for item in values["items"] if item != user_input]
                print(temp[:3])

if not found:
        print([])

你可以在你的數據框上試試這個

import pandas as pd

df = pd.DataFrame({'jsonCol':[{"g":[]}]})
h = df['jsonCol']


def search(inm):
    for item in h:
        if inm in item['items']:
            if len(item['items'])>3:
                item['items'].pop(item['items'].index(inm))
                return item['items'][:3]
            if len(item['items'])<3:
                item['items'].pop(item['items'].index(inm))
                return item['items']
    return []
        
print(search('r'))

希望有幫助

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM