在python

时间:2018-10-31 13:48:08

标签: python-3.x

我有一个数据库名称列表,我想排除以postgres开头的数据库名称。

所以,如果我有[ "postgres", "post", "postgres2", "custom1", "custom2" ]   结果应为[ "post", "custom1", "custom2" ]

我尝试了两种不同的变体,但都没有得到我想要的结果:

其中之一: f_dbs = [d for d in all_dbs if not d.startswith("postgres")]

或: f_dbs = list(filter(lambda d: not d.startswith("postgres"), all_dbs))

f_dbs_str = "\n".join(f_dbs)
print(f"Postgres databases to drop:\n{f_dbs_str}")

两者都不排除列表中的任何内容。 我该怎么写?

编辑: 我使用过滤列表的其他用法更新了该问题,输出也始终显示postgres

编辑: 我发现了问题,strip将所有列表项都排好后,列表中的所有项目都有一个前导空格。

2 个答案:

答案 0 :(得分:1)

第一个方法创建一个新列表,而不是修改原始列表,第二个方法创建一个迭代器,您可以轻松地将其转换为列表。

list_of_dbs = [ "postgres", "post", "postgres2", "custom1", "custom2" ]

filtered_list = [item for item in list_of_dbs if not item.startswith("postgres")]

print(filtered_list)
>>> ['post', 'custom1', 'custom2']

filter_iterator = filter(lambda d: not d.startswith("postgres"), list_of_dbs)

print(filter_iterator)
>>><filter object at 0x10339d470>

print(list(filter_iterator))
>>>['post', 'custom1', 'custom2']

答案 1 :(得分:1)

val OTHDF2 = OTHDF.withColumn("temp", split(col("body"), ","))
               .select($"_tmp".getItem(0).as("id")
                      ,$"_tmp".getItem(1).as("Bal")
                      ,$"_tmp".getItem(2).as("accnum")
                      ,$"_tmp".getItem(3).as("active")
                      ,$"_tmp".getItem(4).as("plan")
                      ,$"_tmp".getItem(5).as("Status")
                      ,$"_tmp".getItem(6).cast("timestamp").as("DateTime")
                      ,$"_tmp".getItem(7).as("Type")
                      ,$"_tmp".getItem(8).as("Loan")
                      ,$"_tmp".getItem(9).as("Where")
                     )
               .drop("_tmp")
               .writeStream
               .format("csv")
               .outputMode("append")
               .option("checkpointLocation", "/FileStore/checkpointLocation.csv")
               .option("path", "/FileStore/data.csv")
               .start()

您的第一个解决方案对我有用。您只需要将其设置为变量:

>>> all_dbs = [ "postgres", "post", "postgres2", "custom1", "custom2" ]
>>> [d for d in all_dbs if not d.startswith('postgres')]
['post', 'custom1', 'custom2']