我有一个数据库名称列表,我想排除以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
将所有列表项都排好后,列表中的所有项目都有一个前导空格。
答案 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']