【问题标题】:find matches of list a in b and return list c在 b 中查找列表 a 的匹配项并返回列表 c
【发布时间】:2022-01-24 11:26:25
【问题描述】:

所以我有以下 3 个列表,需要创建第 4 个:

a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25]
b = ['21', '18', '17', '16', '15', '14', '12', '11', '10', '7', '6', '3', '2']
c = ['1',  '1',  '1',  '1',  '0',  '0',  '1',  '1',  '1',  '1', '0', '0', '1']

a 总是一样的。 b 和 c 始终具有相同的长度,但长度可以变化。 b 的值始终介于 1 和 25 之间。 c 的值始终为 0 或 1。

我需要创建:

d =[0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0]

对于a中的每个项目,我在b中搜索并返回c中的值。

我得到了大约 3000 组不同的 b 和 c,因此试图创造一些有效的东西,但一直无法找到一个好的方法来做到这一点。

【问题讨论】:

  • Map/dict 可以帮助 key 是 b 中的一个,而 value 将是 c 中的关联值(我注意到字符串与整数,但我知道这可能是一个错字)。
  • 当您说“在b 中搜索”时,您的意思是在b 中找到该索引并将其用作c 的索引吗?

标签: indexing match


【解决方案1】:

这可能是您正在寻找的:

def get_value(A,D,x):
    if x in D: return D[x]
    return '0'

a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25]
b = ['21', '18', '17', '16', '15', '14', '12', '11', '10', '7', '6', '3', '2']
c = ['1',  '1',  '1',  '1',  '0',  '0',  '1',  '1',  '1',  '1', '0', '0', '1']

map_b_to_c = dict(list(zip(b,c)))

d = [get_value(a, map_b_to_c, str(x)) for x in a]
print(d)

【讨论】:

    【解决方案2】:

    你实际上可以只用两行来做到这一点,通过创建一个将 b 的值映射到 c 的值的字典。然后,您通过 a and 在每个字母处检查它是否存在于查找字典中:

    lookup = {b_val: c_val for b_val, c_val in zip(b, c)}
    d = [lookup[str(a_val)] if str(a_val) in lookup else "0" for a_val in a]
    

    这应该具有 O(n) 时间复杂度,其中 n 为 max((len(a), len(b)))。

    【讨论】:

      猜你喜欢
      • 2015-08-28
      • 1970-01-01
      • 1970-01-01
      • 2022-10-15
      • 1970-01-01
      • 2012-05-12
      • 1970-01-01
      • 2016-07-14
      • 1970-01-01
      相关资源
      最近更新 更多