在Python中查找列表与多个子列表之间的匹配索引

时间:2018-02-20 20:16:55

标签: python list search match

针:['', 'yes', 'yes', '', '', '', 'yes', 'yes', 'yes', '']

干草堆:[['', '', 'yes', 'yes', '', '', 'yes', 'yes', '', 'yes'], ['', '', '', 'yes', 'yes', '', '', '', 'yes', 'yes']]

Needle与Haystack [0]在2,6,7匹配并与Haystack [1]在8匹配,我希望能够创建这些索引的匹配列表。

目前:我的代码返回[1,2,6,7,8],并没有告诉我匹配的位置......不确定为什么它会在1找到匹配项:

for sublist in (haystack):
print(needle)
print(sublist)
print([i for i, item in enumerate(needle) if item in sublist and item != ''])

我的输出看起来像

['', 'yes', 'yes', '', '', '', 'yes', 'yes', 'yes', '']
['', '', 'yes', 'yes', '', '', 'yes', 'yes', '', 'yes']
[1, 2, 6, 7, 8]
['', 'yes', 'yes', '', '', '', 'yes', 'yes', 'yes', '']
['', '', '', 'yes', 'yes', '', '', '', 'yes', 'yes']
[1, 2, 6, 7, 8]

完全可重复:

needle = ['', 'yes', 'yes', '', '', '', 'yes', 'yes', 'yes', '']
haystack = [['', '', 'yes', 'yes', '', '', 'yes', 'yes', '', 'yes'], ['', '', '', 'yes', 'yes', '', '', '', 'yes', 'yes']]`

for sublist in (haystack):
    print(needle)
    print(sublist)
    print([i for i, item in enumerate(needle) if item in sublist and item != ''])

4 个答案:

答案 0 :(得分:2)

使用enumerate zip

for sublist in haystack:
    print(needle)
    print(sublist)
    print([i for i, (x, y) in enumerate(zip(needle, sublist)) if x and y and x == y])

输出:

['', 'yes', 'yes', '', '', '', 'yes', 'yes', 'yes', '']
['', '', 'yes', 'yes', '', '', 'yes', 'yes', '', 'yes']
[2, 6, 7]
['', 'yes', 'yes', '', '', '', 'yes', 'yes', 'yes', '']
['', '', '', 'yes', 'yes', '', '', '', 'yes', 'yes']
[8]

答案 1 :(得分:1)

正如TemporalWolf指出的那样,我在列举错误的东西......以下是有效的!

IF EXIST C:\data_TX (
  ren "C:\data" "data_CA"
  ren "C:\data_TX" "data"
) ELSE (
  ren "C:\data" "data_TX"
  ren "C:\data_CA" "data"
)

答案 2 :(得分:1)

您在寻找什么 -

needle = ['', 'yes', 'yes', '', '', '', 'yes', 'yes', 'yes', '']
haystack = [['', '', 'yes', 'yes', '', '', 'yes', 'yes', '', 'yes'],
['', '', '', 'yes', 'yes', '', '', '', 'yes', 'yes']]

for sublist in (haystack):
    print(needle)
    print(sublist)
    print([i for i, item in enumerate(needle) if item == sublist[i] and item != ''])

答案 3 :(得分:1)

如果我理解正确,那么您在数组之间寻找逻辑AND,"yes"1""0

因此,如果我们首先将您的数据转换为二进制文件:(当然,您可以跳过此段并假设我们首先拥有二进制数据...)

import numpy as np
def convert_to_binary(arr):
  return 1 * (np.array(arr) == 'yes')
needle = convert_to_binary(needle)
# array([0, 1, 1, 0, 0, 0, 1, 1, 1, 0])
haystack = np.array([convert_to_binary(h_arr) for h_arr in haystack])
# array([[0, 0, 1, 1, 0, 0, 1, 1, 0, 1],
#        [0, 0, 0, 1, 1, 0, 0, 0, 1, 1]])

他们的逻辑AND:

their_logical_and = needle & haystack
# array([[0, 0, 1, 0, 0, 0, 1, 1, 0, 0],
#        [0, 0, 0, 0, 0, 0, 0, 0, 1, 0]])

要实现非零指数,可以使用numpy.nonzero

indices = [list(np.nonzero(arr)[0]) for arr in their_logical_and]
# [[2, 6, 7], [8]]