条件笛卡尔的单行代码在python中具有元组列表的字符串列表的产品

时间:2018-03-26 03:16:53

标签: python string tuples itertools

我有一个字符串列表和一个元组列表。

输入:

string_list = ['www.cars.com/BMW/' ,'www.cars.com/VW/']
tuple_list = [('BMW','green'), ('BMW','blue'), 
               ('VW','black'), ('VW','red'), ('VW','yellow')]

第一步:对于string_list中的每个密钥,我需要在tuple_list中过滤匹配的键/值对:

string_list = ['www.cars.com/BMW/']
tuple_list = [('BMW','green'), ('BMW','blue')]

第二步:在一个最终输出列表中,我需要在string_list中使用tuple_list中的每个匹配键/值对形成所有字符串的笛卡尔积:< / p>

输出:

results_list = ['www.cars.com/BMW/green','www.cars.com/BMW/blue', 
  'www.cars.com/VW/black''www.cars.com/VW/red','www.cars.com/VW/yellow']

我当前的方法使用了一系列嵌套的for - 循环,其代价是缓慢,丑陋和太长。

如何在字符串列表和python中的元组列表之间有效地形成条件笛卡尔积?

3 个答案:

答案 0 :(得分:4)

一个班轮:

result = [s + b for s in string_list for a, b in tuple_list if a in s]

基本上,还有两个for循环。

>>> print(result)
['www.cars.com/BMW/green', 'www.cars.com/BMW/blue', 'www.cars.com/VW/black', 'www.cars.com/VW/red', 'www.cars.com/VW/yellow']

答案 1 :(得分:1)

您可以尝试:

['www.cars.com/BMW/green', 'www.cars.com/BMW/blue', 'www.cars.com/VW/black', 'www.cars.com/VW/red', 'www.cars.com/VW/yellow']

输出:

{{1}}

答案 2 :(得分:1)

如果您为查找预先构建字典,则可以进一步提高性能:

<强>鉴于

import collections as ct


colors =  ct.defaultdict(list)
for k, v in tuple_list:
    colors[k].append(v)

colors
# defaultdict(list, {'BMW': ['green', 'blue'], 'VW': ['black', 'red', 'yellow']})

<强>代码

[s + c for s in string_list for c in colors[s[13:-1]]]

输出

['www.cars.com/BMW/green',
 'www.cars.com/BMW/blue',
 'www.cars.com/VW/black',
 'www.cars.com/VW/red',
 'www.cars.com/VW/yellow']

<强>性能

%timeit -n 100000 [s + b for s in string_list for a, b in tuple_list if a in s]  # @iBug
%timeit -n 100000 [s + c for s in string_list for c in colors[s[13:-1]]]         # proposed    
# 100000 loops, best of 3: 3.54 µs per loop
# 100000 loops, best of 3: 2.83 µs per loop