簡體   English   中英

按鍵值過濾字典列表 - 將答案作為字典列表返回

[英]Filter list of dictionaries by key value - return answers as a list of dictionaries

我有一個要過濾的字典列表。

[{"Slope": -0.562, "Count": 3},
 {"Slope": -0.362, "Count": 6},
 {"Slope": -0.762, "Count": 8},
 {"Slope": -0.562, "Count": 12},
 {"Slope": 2.5, "Count": 34},
 {"Slope": 1.52, "Count": 2},
 {"Slope": .56, "Count": 6}]

我的目標是獲得兩個字典的列表。 一個具有“最高計數和正斜率”,另一個具有“最高計數和負斜率”。

我的計划是過濾掉所有正面和負面的,然后對每個列表進行排序,然后使用每個列表的第一條記錄創建一個新列表。

排序列表對我來說不是問題,我有這個!

lines_lst.sort(key=lambda i: i['lines_count'])

但是當我嘗試這個時過濾似乎不起作用,因為它返回一個字典。

positive_lines = next(item for item in lines_lst if item["Slope"] > 0)

有沒有人有最終得到以下解決方案?

[{"Slope": -0.562, "Count": 12},{"Slope": 2.5, "Count": 34}]

你想要最大值和最小值..使用它們並應用合適的密鑰 function - 實際上使用元組你只需要最大值:

data = [{"Slope": -0.562, "Count": 3},
        {"Slope": -0.362, "Count": 6},
        {"Slope": -0.762, "Count": 8},
        {"Slope": -0.562, "Count": 12},
        {"Slope": 2.5, "Count": 34},
        {"Slope": 1.52, "Count": 2},
        {"Slope": .56, "Count": 6}]

m1 = max(data, key= lambda x: (x["Slope"]>0, x["Count"]))
m2 = max(data, key= lambda x: (x["Slope"]<0, x["Count"]))

result = [m1,m2]

print(result)

Output:

[{'Slope': 2.5, 'Count': 34}, {'Slope': -0.562, 'Count': 12}]

元組按第一個值排序,然后是第二個值 - 您可以構建元組並將它們用作最大鍵 function。

您可以將生成器表達式傳遞給max()

>>> max((d for d in lines_lst if d["Slope"] > 0), key=lambda d: d["Count"])
{'Slope': 2.5, 'Count': 34}
>>> max((d for d in lines_lst if d["Slope"] < 0), key=lambda d: d["Count"])
{'Slope': -0.562, 'Count': 12}

當然,這個解決方案會迭代lines_lst兩次。 如果您有一個非常大的輸入,您可以貪婪地遍歷它一次,跟蹤運行的最大/最小:

import sys

max_pos, max_neg = {"Count": -sys.maxsize}, {"Count": -sys.maxsize}
for d in lines_lst:
    ct = d["Count"]
    if d["Slope"] > 0 and ct > max_pos["Count"]:
        max_pos = d
    elif d["Slope"] < 0 and ct > max_neg["Count"]:
        max_neg = d

但在 Python 領域,這可能僅在您的輸入非常龐大且笨拙時才有價值。

請注意,在這兩種情況下,對max_pos / max_neg的 _further 修改構成對lines_lst成員的修改,因為這些成員是可變字典。

您可以通過以下方式進行操作:

inList = [{"Slope": -0.562, "Count": 3},
{"Slope": -0.362, "Count": 6},
{"Slope": -0.762, "Count": 8},
{"Slope": -0.562, "Count": 12},
{"Slope": 2.5, "Count": 34},
{"Slope": 1.52, "Count": 2},
{"Slope": .56, "Count": 6}]

maximum = max(filter(lambda elem: elem['Slope'] > 0, inList), key=lambda e: e['Count'])
minimum = max(filter(lambda elem: elem['Slope'] < 0, inList), key=lambda e: e['Count'])

這將返回:

{'Slope': 2.5, 'Count': 34}
{'Slope': -0.562, 'Count': 12}

創建一個對負斜率為負的 Count2 鍵。 然后按 Count2 排序並取第一個和最后一個元素。

lines_lst = [{"Slope": -0.562, "Count": 3},
 {"Slope": -0.362, "Count": 6},
 {"Slope": -0.762, "Count": 8},
 {"Slope": -0.562, "Count": 12},
 {"Slope": 2.5, "Count": 34},
 {"Slope": 1.52, "Count": 2},
 {"Slope": .56, "Count": 6}]


for i in range(len(lines_lst)):
    lines_lst[i]['Count2'] = lines_lst[i]['Count']*lines_list[i]['Slope']/abs(lines_list[i]['Slope'])

lines_lst.sort(key=lambda i: i['Count2'])

[lines_lst[0], lines_lst[-1]]

要解決帕特里克回答中的其他信息,您可以這樣做以首先對否定/肯定列表進行排序:

positives = sorted((v for v in data if v['Slope'] >= 0), key=lambda x: x['Count'])
negatives = sorted((v for v in data if v['Slope'] < 0), key=lambda x: x['Count'])

# positives:
# [{'Slope': 1.52, 'Count': 2}, {'Slope': 0.56, 'Count': 6}, {'Slope': 2.5, 'Count': 34}]

# negatives:
# [{'Slope': -0.562, 'Count': 3}, {'Slope': -0.362, 'Count': 6}, {'Slope': -0.762, 'Count': 8}, {'Slope': -0.562, 'Count': 12}]

在這一點上獲得最大值很簡單。 只需檢索最后一個元素:

max_pox = positives[-1]     # {'Slope': 2.5, 'Count': 34}
max_neg = negatives[-1]     # {'Slope': -0.562, 'Count': 12}

或者,如果您更喜歡列表形式:

[x[-1] for x in (negatives, positives)]

# [{'Slope': -0.562, 'Count': 12}, {'Slope': 2.5, 'Count': 34}]

這行得通嗎?

data = [{"Slope": -0.562, "Count": 3},
{"Slope": -0.362, "Count": 6},
{"Slope": -0.762, "Count": 8},
{"Slope": -0.562, "Count": 12},
{"Slope": 2.5, "Count": 34},
{"Slope": 1.52, "Count": 2},
{"Slope": .56, "Count": 6}]
positive_lines = []
negative_lines = []
for i in range(len(data)):
    if data[i]["Slope"] < 0:
        negative_lines.append(data[i])
    else:
        positive_lines.append(data[i])
max_counts = []
max_counts.append(max(positive_lines, key=lambda x:x['Count']))
max_counts.append(max(negative_lines, key=lambda x:x['Count']))
print(max_counts)

Output:

[{'Slope': 2.5, 'Count': 34}, {'Slope': -0.562, 'Count': 12}]

暫無
暫無

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

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