是否有一个函数返回给定令牌集的所有可能的完成组合?

2024-05-14 07:20:14 发布

您现在位置:Python中文网/ 问答频道 /正文

是否有一个python函数返回给定令牌集的所有可能的完成组合:

tokens = ["Afoo","fooB","Abar","Bbar","barA","barBX","barBY"]

complete(tokens,"foo","barB")

应返回:

[["Afoo","barBX"],["Afoo","barBY"],["fooB","barBX"],["fooB","barBY"]]

Tags: 函数foocompletetokensbarbyfoobbarbbbar
3条回答

我想到了这个解决办法

我得到了所有的食物和倒刺 然后我把这两张单子合起来

tokens = ["Afoo", "fooB", "Abar", "Bbar", "barA", "barBX", "barBY"]

foo = [a for a in tokens if "foo" in a]

barB = [a for a in tokens if "barB" in a]

x = [(a, b) for a in foo for b in barB]

print(x)

output:

[('Afoo', 'barBX'), ('Afoo', 'barBY'), ('fooB', 'barBX'), ('fooB', 'barBY')]

更快

tokens = ["Afoo", "fooB", "Abar", "Bbar", "barA", "barBX", "barBY"]

x = [(a, b) for a in tokens if "foo" in a for b in tokens if "barB" in b]

print(x)

output:

[('Afoo', 'barBX'), ('Afoo', 'barBY'), ('fooB', 'barBX'), ('fooB', 'barBY')]

据我所知,没有这样的函数,但这是使用循环的一个简单方法:

def complete(tokens, foo, bar):
    return [(i, j) for i in tokens if foo in i for j in tokens if bar in j]

当然不是超级高效!可以使用生成器执行相同的操作:

def complete(tokens, foo, bar):
    return ((i, j) for i in tokens if foo in i for j in tokens if bar in j)

使用itertools将其分解为搜索步骤和“查找组合”步骤

from itertools import product
def complete(tokens, searches):
    # search
    matches = [[t for t in tokens if s in t] for s in searches]

    # find all combinations https://docs.python.org/3/library/itertools.html
    return product(*matches)

tokens = ["Afoo", "fooB", "Abar", "Bbar", "barA", "barBX", "barBY"]
search = ["foo", "barB"]

combinations = list(complete(tokens, search)

相关问题 更多 >

    热门问题