python - 如何检查嵌套列表中的多个值是否彼此相邻?
问题描述
这些是我目前的代码:
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 行。
解决方案
编辑问题以包含两个以上的相邻值后:
您可以根据每行中搜索值的索引构建一个列表列表
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])
推荐阅读
- python-3.x - 从印地语字符到 unicode 字符的 Python dict 映射
- java - 如何在 SVG Path 元素中应用复合操作?
- python-3.x - 当我们使用 ML 在输入文本中有一些模式时预测 Y?
- r - 如何清除所有属性?
- powershell - 函数的返回值未分配给powershell中的变量
- php - 核心 php 扩展升级到 laravel
- flutter - VSCode 中有设备文件资源管理器吗?
- google-api - 如何调试身份验证配置?
- java - Java的列表迭代器
- php - FatalThrowableError (E_ERROR) 在 null 上调用成员函数回复()