首页 > 解决方案 > 如何检查嵌套列表中的多个值是否彼此相邻?

问题描述

这些是我目前的代码:

points = 0
#where points is 1 per individual HWY connected to each other

map1 = [ ['HWY', 'HWY', 'HWY', 'FAC'],
         ['HWY', 'HWY', '   ', 'SHP'],
         ['   ', 'HSE', 'HSE', 'FAC'],
         ['HWY', 'BCH', 'HSE', 'HSE'] ]

在这种情况下,可以根据HWY每行中的数量更改点数,因此如果第一行有 3 HWY,则仅第一行的点数将是 3 + 3 + 3 。

这是我当前的代码:

map1 = [ ['HWY', 'HWY', 'HWY', 'HWY'],
         ['HWY', 'HWY', 'SHP', 'SHP'],
         ['   ', 'HSE', 'HSE', 'FAC'],
         ['HWY', 'BCH', 'HSE', 'HSE'] ]

SHP_pos = [(idx, i) for idx, sublist in enumerate(map1) for i, v in enumerate(sublist) if v == 'HWY']
count_list1 = []
count_list2 = []
count_list3 = []
count_list4 = []

for x in SHP_pos:
     if x[0] == 0:
          count1 = x[1]
          count_list1.append(count1)

     if x[0] == 1:
          count2 = x[1]
          count_list2.append(count2)

     if x[0] == 2:
          count3 = x[1]
          count_list3.append(count3)

     if x[0] == 3:
          count4 = x[1]
          count_list4.append(count4)

print(count_list1, count_list2, count_list3, count_list4)

print(SHP_pos)

在此之后,我正打算这样做count = len(count_list1) ** len(count_list1) + len(count_list2) ** len(count_list2) + len(count_list3) ** len(count_list3) + len(count_list4) ** len(count_list4)

我的代码的问题是它不检查是否HWY彼此相邻,例如,如果map1[ [ 'HWY', 'HWY', 'FAC', 'HWY']...对于第 1 行,它仍然会显示为count_list1 = [0, 1, 3],当我使用它时len(),答案将是错误的,因为假设点应该是:2 + 2 + 1 表示第 1 行。

标签: pythonpython-3.x

解决方案


编辑问题以包含两个以上的相邻值后:

您可以根据每行中搜索值的索引构建一个列表列表

def group_sequence(lst):
    if not lst:
        return []

    res = [[lst[0]]]
    for i in range(1, len(lst)):
        if lst[i - 1] + 1 == lst[i]:
            res[-1].append(lst[i])
        else:
            res.append([lst[i]])
    return res


map1 = [['HWY', 'HWY', 'HWY', 'FAC'],
        ['HWY', 'HWY', '   ', 'SHP'],
        ['   ', 'HSE', 'HSE', 'FAC'],
        ['HWY', 'BCH', 'HSE', 'HSE']]

map2 = [['HWY', 'HWY', 'HWY', 'HWY'],
        ['HWY', 'HWY', 'SHP', 'SHP'],
        ['   ', 'HSE', 'HSE', 'FAC'],
        ['HWY', 'BCH', 'HSE', 'HSE']]

target = 'HWY'

# map1
points = sum(len(group) for row in map1 for group in group_sequence([i for i, x in enumerate(row) if x == target])
             if len(group) > 1)
print(points) # 5

# map2
points = sum(len(group) for row in map2 for group in group_sequence([i for i, x in enumerate(row) if x == target])
             if len(group) > 1)
print(points) # 6

原始的,如果您最多有两个相邻的值:

您可以遍历每行中的每个项目并检查当前项目是否与下一个项目相同并且等于HWY

target = 'HWY'
points = 0
for row in map1:
    for i in range(len(row) - 1):
        if row[i] == target and row[i] == row[i + 1]:
            points += 2
print(points)

或者使用生成器表达式

points = sum(2 for row in map1 for i in range(len(row) - 1) if row[i] == target and row[i] == row[i + 1])

推荐阅读