根据特定条件匹配两个列表

Match two lists on specific conditions

提问人:Zalman 提问时间:6/14/2023 更新时间:6/15/2023 访问量:48

问:

我有一个 2 个列表,其中包含我想要匹配的数据,并收到带有“True”或“False”的第 3 个列表。但是,我需要创建一个特殊的匹配项。请参阅下面的代码。

import pandas as pd

list1 = ['food', 'food', 'item']
list2 = ['apple fr', 'cherry fr', 'banana fr']
my_list1 = list(map(str, list1))
my_list2 = list(map(str, list2))
for i in range(len(my_list2)):
    if my_list2[i] in [s for s in my_list2 if "fr" in s]:
        my_list2[i] = 'food'
result = []
for i in range(int(len(my_list1))):
    result.append(my_list1[i] == my_list2[i])
my_data1 = pd.DataFrame({'a': list1, 'b': list2, 'check': result})
print(my_data1) 

输出:

      a          b  check
0  food   apple fr   True
1  food  cherry fr   True
2  item  banana fr  False

基本上,我想使用下一个模式匹配列表的元素:如果 list2 的 elem 有“fr”,那么它应该在 list1 的“food”元素上返回 True。

正如你所看到的,我已经有一种解决方案,我正在复制列表,编辑它们并比较编辑后的副本。但是,这种方法并不是最好的,因为它确实会消耗内存。也许可以使用“if”条件而不是操作数据。有没有更好的方法?谢谢

Python 熊猫 列表 布尔 匹配

评论

0赞 John Gordon 6/14/2023
my_list1 = list(map(str, list1))这有什么意义?其中的项目显然已经是字符串了。list1

答:

0赞 Michael Hodel 6/14/2023 #1

如果我正确理解了检查,那只是一个问题“list1 中的元素是否等于 'food' () 和 () list2 中的元素是否以 'fr' () 结尾。df['a'] == 'food'&df['b'].str.endswith(' fr')

import pandas as pd

list1 = ['food', 'food', 'item', 'food']
list2 = ['apple fr', 'cherry fr', 'banana fr', 'berry us']
df = pd.DataFrame([list1, list2]).T
df.columns = ['a', 'b']
df['check'] = (df['a'] == 'food') & (df['b'].str.endswith(' fr'))
print(df)

指纹

      a          b  check
0  food   apple fr   True
1  food  cherry fr   True
2  item  banana fr  False
3  food   berry us  False

评论:当然,假设元素 的元素只有在它们以“fr”结尾时才应该匹配,但是如果它们在任何地方都包含“fr”,则不会匹配,这就是检查(例如 会回来的,虽然我猜你不会想要这个)。endswith(' fr')list2if "fr" in sfr in 'jackfruit'True

0赞 iGian 6/15/2023 #2

您还可以通过这种方式创建检查列,利用:

check = [list1[i] == ("food" if ("fr" in s) else "item") for i, s in enumerate(list2)]