【问题标题】:Filter a list in Python在 Python 中过滤列表
【发布时间】:2021-09-17 22:37:50
【问题描述】:

我有一个 Python 列表

用户名、功能、项目、描述、日期、时间、年份、版本

['erinil01', 'Oppstart', '', 'Startet programmet', '06/07/21', '12:48:54', '2021', '2']
['erinil01', 'Oppstart', '', 'Startet programmet', '06/07/21', '12:56:49', '2021', '2']
['erinil01', 'Prosjektadmin', '920208', 'Lastet prosjektet', '06/07/21', '12:59:09', '2021', '2']
['erinil01', 'Prosjektadmin', '920208', 'Lagret prosjektet', '06/07/21', '12:59:17', '2021', '2']
['erh4021', 'Oppstart', '', 'Startet programmet', '06/07/21', '13:02:38', '2021', '2']
['erinil01', 'Prosjektadmin', '921106', 'Lagt til nytt prosjekt', '06/07/21', '13:06:45', '2021', '2']
['erinil01', 'Prosjektadmin', '921107', 'Lagt til nytt prosjekt', '06/07/21', '13:07:02', '2021', '2']
['erinil01', 'Prosjektadmin', '921106', 'Lastet prosjektet', '06/07/21', '13:07:08', '2021', '2']

假设我只想根据不同的条件过滤此列表,例如用户名、功能、项目、日期、年份等。如果某些过滤器为空,则根据其他条件全部显示。

提示?

【问题讨论】:

  • 你好,你所说的 var3='' 是什么意思
  • 添加一个适当的列表示例和预期的输出
  • 列表有索引 - 你可以检查 if list[0] == 3 and list[1] == 5 ... 。如果你有它作为嵌套列表,那么你可以使用for-looo - 比如for row in data: if row[0] == 3 and row[1] == 5 ...。如果您想使标准更通用,则还应保留为列表或字典{0: 3, 1: 5, 2: "", 3: 6},然后您也可以使用for-loop 来检查每个标准。或使用pandas.DataFrame 使其更简单。最终你可以将它保存在database 并为此使用SQL Query
  • 您可以提供一些示例输入和所需的输出,让人们理解并帮助您。你能展示一下到目前为止所做的工作吗?
  • 你尝试了什么?您如何保留这些数据 - 作为嵌套列表 [ [...], [...], ...] 或从 databasefile 等来源获取?在大多数情况下,您将运行 for-loop 来获取单个 row 数据并检查您的标准 - 通过检查 row[0]row[1] 等具有预期值。

标签: python list if-statement filter


【解决方案1】:

你没有说你是如何得到这个列表的,但它看起来很像嵌套列表。

data = [
    ['erinil01', 'Oppstart', '', 'Startet programmet', '06/07/21', '12:48:54', '2021', '2'],
    ['erinil01', 'Oppstart', '', 'Startet programmet', '06/07/21', '12:56:49', '2021', '2'],
    ['erinil01', 'Prosjektadmin', '920208', 'Lastet prosjektet', '06/07/21', '12:59:09', '2021', '2'],
    ['erinil01', 'Prosjektadmin', '920208', 'Lagret prosjektet', '06/07/21', '12:59:17', '2021', '2'],
    ['erh4021', 'Oppstart', '', 'Startet programmet', '06/07/21', '13:02:38', '2021', '2'],
    ['erinil01', 'Prosjektadmin', '921106', 'Lagt til nytt prosjekt', '06/07/21', '13:06:45', '2021', '2'],
    ['erinil01', 'Prosjektadmin', '921107', 'Lagt til nytt prosjekt', '06/07/21', '13:07:02', '2021', '2'],
    ['erinil01', 'Prosjektadmin', '921106', 'Lastet prosjektet', '06/07/21', '13:07:08', '2021', '2'],
]

对于嵌套列表,您必须使用 for-loop 单独处理每一行。

并且对于每一行,您都可以使用索引来检查值。

这将获取所有具有空值Project 的行,其索引为[2]

filtered_data = []

for row in data:
    if not row[2]:
        #print('empty:', row)
        filtered_data.append(row)
      
print('--- filtered_data ---')

for row in filtered_data:
    print(row)

对于更复杂的过滤器,您必须创建更复杂的if

为了使其更通用,您可以创建获取单行的函数,如果您想保留这一行,则返回 TrueFalse

def selected(row):
    #if not row[2]:
    #    return True
    #else:
    #    return False
    
    # shorter
    return not row[2]

filtered_data = []

for row in data:
    if selected(row):
        #print('empty:', row)
        filtered_data.append(row)

然后你甚至可以将其简化为列表理解

filtered_data = [row for row in data if selected(row)]

或使用函数filter()

filtered_data = list(filter(selected, data))

这样你可以创建不同的函数selected()来组合过滤器。

filtered_data = list(filter(selected_1, data))
filtered_data = list(filter(selected_2, filtered_data))
filtered_data = list(filter(selected_3, filtered_data))

顺便说一句:

如果您从数据库中获取数据,那么您可以在从数据库中获取数据时直接使用SQL query 过滤数据。

如果您可以将数据保存在 pandas.DataFrame 中,那么您可以使用列名称 Username, Function, Project, Description, Date, Time, Year, Version 对其进行过滤。


编辑:

最小的工作示例

data = [
    ['erinil01', 'Oppstart', '', 'Startet programmet', '06/07/21', '12:48:54', '2021', '2'],
    ['erinil01', 'Oppstart', '', 'Startet programmet', '06/07/21', '12:56:49', '2021', '2'],
    ['erinil01', 'Prosjektadmin', '920208', 'Lastet prosjektet', '06/07/21', '12:59:09', '2021', '2'],
    ['erinil01', 'Prosjektadmin', '920208', 'Lagret prosjektet', '06/07/21', '12:59:17', '2021', '2'],
    ['erh4021', 'Oppstart', '', 'Startet programmet', '06/07/21', '13:02:38', '2021', '2'],
    ['erinil01', 'Prosjektadmin', '921106', 'Lagt til nytt prosjekt', '06/07/21', '13:06:45', '2021', '2'],
    ['erinil01', 'Prosjektadmin', '921107', 'Lagt til nytt prosjekt', '06/07/21', '13:07:02', '2021', '2'],
    ['erinil01', 'Prosjektadmin', '921106', 'Lastet prosjektet', '06/07/21', '13:07:08', '2021', '2'],
]

# --- version 1 ---

filtered_data = []

for row in data:
    if (not row[2]) or (int(row[2]) > 920208):
        #print('empty:', row)
        filtered_data.append(row)
      
print('--- filtered_data ---')

for row in filtered_data:
    print(row)
    
# --- version 2 ---
    
def selected(row):
    #if (not row[2]) or (int(row[2]) > 920208):
    #    return True
    #else:
    #    return False
    
    # shorter
    return (not row[2]) or (int(row[2]) > 920208)
    
def selected_1(row):
    return not row[2]

def selected_2(row):
    return int(row[2]) > 920208

filtered_data = []

for row in data:
    if selected_1(row) or selected_2(row):
    #if selected(row):
        #print('empty:', row)
        filtered_data.append(row)
      
print('--- filtered_data ---')

for row in filtered_data:
    print(row)
    
# --- version 3 ---
    
def selected(row):
    return (not row[2]) or (int(row[2]) > 920208)
    
def selected_1(row):
    return not row[2]

def selected_2(row):
    return int(row[2]) > 920208

filtered_data = [row for row in data if selected(row)]
filtered_data = [row for row in data if selected_1(row) or selected_2(row)]
      
print('--- filtered_data ---')

for row in filtered_data:
    print(row)
    
# --- version 4 ---
    
def selected(row):
    return (not row[2]) or (int(row[2]) > 920208)
    
def selected_1(row):
    return not row[2]

def selected_2(row):
    return int(row[2]) > 920208

#filtered_data = list(filter(selected, data))
filtered_data = list(filter(lambda row:selected_1(row) or selected_2(row), data))
      
print('--- filtered_data ---')

for row in filtered_data:
    print(row)            

编辑:

pandas类似

data = [
    ['erinil01', 'Oppstart', '', 'Startet programmet', '06/07/21', '12:48:54', '2021', '2'],
    ['erinil01', 'Oppstart', '', 'Startet programmet', '06/07/21', '12:56:49', '2021', '2'],
    ['erinil01', 'Prosjektadmin', '920208', 'Lastet prosjektet', '06/07/21', '12:59:09', '2021', '2'],
    ['erinil01', 'Prosjektadmin', '920208', 'Lagret prosjektet', '06/07/21', '12:59:17', '2021', '2'],
    ['erh4021', 'Oppstart', '', 'Startet programmet', '06/07/21', '13:02:38', '2021', '2'],
    ['erinil01', 'Prosjektadmin', '921106', 'Lagt til nytt prosjekt', '06/07/21', '13:06:45', '2021', '2'],
    ['erinil01', 'Prosjektadmin', '921107', 'Lagt til nytt prosjekt', '06/07/21', '13:07:02', '2021', '2'],
    ['erinil01', 'Prosjektadmin', '921106', 'Lastet prosjektet', '06/07/21', '13:07:08', '2021', '2'],
]
    
import pandas as pd
import numpy as np

df = pd.DataFrame(data, columns=['Username', 'Function', 'Project', 'Description', 'Date', 'Time', 'Year', 'Version'])
df = df.replace(r'', np.nan)  # to compare empty string with `float` value `920208`
print(df)

mask1 = df['Project'].isnull()  # detect `np.nan`
#print(mask1)

mask2 = (df['Project'].astype(float) > 920208)
#print(mask2)

filtered_data = df[ mask1 | mask2 ]  # `|` means `or` , `&` means `and`

print('--- filtered_data ---')

print(filtered_data)

【讨论】:

    猜你喜欢
    • 2017-10-29
    • 2019-04-18
    • 2012-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多