过滤包含特定字符串的列表

Filter a list containing specific string

我的目标

我有一组特定的长列表,其中包含许多具有不同结尾的资产对:BTCUSDT ETHBTC ANKRETH...从这个列表中,我想过滤掉以 USDT 结尾的交易品种。

我的问题:

我已经尝试使用 filterall 进行迭代,但是 none 提供了准确的结果。

这是我的尝试:

尝试 1:

my_set = ['LUNAUSDT', 'ETHBTC', 'ETHBNB', 'BTCUSDT', 'MANATUSD', 'ALICEETH' ]
my_set = [word for word in symbols if 'USDT' in my_set]
my_set

This results in an empty set.

尝试 2:

keyword = ['USDT']
my_set = ['LUNAUSDT', 'ETHBTC', 'ETHBNB', 'BTCUSDT', 'MANATUSD', 'ALICEETH' ]
final = [ x for x in my_set in all(keyword in keyword for keyword in my_set)]
final

这会导致错误:

TypeError: argument of type 'bool' is not iterable

尝试 3:

my_final_set = filter(lambda x:x.endswith(("USDT")), my_set)
my_final_set

This shows: <filter at 0x7fe537eebf10>

我基本上想要我的最终列表,其中所有符号都以 USDT

结尾

例如:

my_set = ['LUNAUSDT', 'ETHBTC', 'ETHBNB', 'BTCUSDT', 'MANATUSD', 'ALICEETH' ]

结果:['LUNAUSDT', 'BTCUSDT']

对于我做错的任何帮助或建议,我们将不胜感激。提前致谢!

你快到了。试试这个:

my_set = ['LUNAUSDT', 'ETHBTC', 'ETHBNB', 'BTCUSDT', 'MANATUSD', 'ALICEETH' ]
final = [word for word in my_set if 'USDT' in word]
print(final)

对于您的尝试 3,进行以下更改:

my_final_set = list(filter(lambda x:x.endswith(("USDT")), my_set)) 

另一种方法是使用 .endswith():

final = [word for word in my_set if word.endswith('USDT')]
print(final)

输出:

['LUNAUSDT', 'BTCUSDT']

解决方案使用 filter 函数和 list-comprehension

my_set = ['LUNAUSDT', 'ETHBTC', 'ETHBNB', 'BTCUSDT', 'MANATUSD', 'ALICEETH' ]
keyword = 'USDT'

result1 = list(filter(lambda word: word.endswith(keyword), my_set))
result2 = [ word for word in my_set if word.endswith(keyword)]

您可以使用正则表达式:

import re

my_set = ['LUNAUSDT', 'ETHBTC', 'ETHBNB', 'BTCUSDT', 'MANATUSD', 'ALICEETH' ]

my_filtered_set = [ i for i in my_set if re.search('USD$',i) ] 

尝试 1

[word for word in symbols if 'USDT' in my_set]

这里有两个错误:

  • 'USDT' in my_set 检查 'USDT' 是否包含在输入列表中,而不是它是否包含在 其中一个单词 中输入列表。你应该使用 'USDT' in word.

  • 'USDT' in word 将检查 'USDT' 是否包含在 anywhere in word 中(不仅仅是在末尾)。为了检查字符串 是否以 特定后缀结尾,请使用 word.endswith('USDT').

尝试 2

[ x for x in my_set in all(keyword in keyword for keyword in my_set)]

这使您的尝试毫无意义。 all(...) returns TrueFalse,取决于条件是否对可迭代的所有元素都为真。在这种情况下,keyword in keyword 显然对来自 my_set 的所有单词 keyword 为真,因此这等同于

[x for x in my_set in True]

在这里,Python 会尝试评估 my_set in True,就好像 True 是某种集合。它通过尝试遍历 True(然后依次检查是否有任何项目等于 my_set)来尝试这样做,这是不可能的。

尝试 3

filter(lambda x:x.endswith(("USDT")), my_set)

这大部分是正确的,但是 filter returns 一个 迭代器 ,只有 returns 迭代它的结果。为了得到一个列表,你必须使用迭代器:

list(filter(lambda x: x.endswith(("USDT")), my_set))

约等于

result = []
for y in filter(lambda x: x.endswith(("USDT")), my_set):
    result.append(y)