【问题标题】:How to return the elements around another element in a python list?如何返回python列表中另一个元素周围的元素?
【发布时间】:2021-06-24 19:03:28
【问题描述】:

我正在尝试返回围绕另一个特定元素形成正方形的元素。例如:

square_ele('j', [['a', 'b', 'c', 'd'], ['e', 'f', 'g', 'h'], ['i' , 'j', 'k', 'l'], ['m', 'n', 'o', 'p']])

应该返回在 'j' 周围形成正方形的元素:

['e', 'f', 'g', 'i', 'k', 'm', 'n', 'o']

我试图返回 element[ele-1]/element[ele+1]... 和类似的东西,但它不起作用。 谁能帮帮我?

【问题讨论】:

  • 你能说得清楚一点吗?在这种情况下什么是正方形? element 是什么?和ele ?
  • element like : for list1 中的元素,ele like: for ele in element。而正方形是与特定元素水平、垂直和对角相邻的索引

标签: python python-3.x list arraylist python-requests


【解决方案1】:

类似这样的:

def f(letter, lst):
    for i in range(len(lst)):
        for j in range(len(lst[i])):
            if lst[i][j] == letter:
                return lst[i-1][j-1:j+2] + [lst[i][j-1]] + [lst[i][j+1]] + lst[i+1][j-1:j+2]

【讨论】:

  • 它不返回对角线
  • 我的错!现在应该修复了
【解决方案2】:
  1. 通过逐个搜索网格元素找到目标,并获取其坐标
  2. 通过坐标对其邻居进行交互,不要忘记跳过不存在的邻居(例如,字母“a”只有三个邻居)
def square_ele(tgt, grid):
    tgt_x, tgt_y = -1, -1
    for row_idx, row in enumerate(grid):
        for col_idx, element in enumerate(row):
            if element == tgt:
                tgt_x, tgt_y = row_idx, col_idx
    neighbour = []
    for row_offset in range(-1, 2):
        for col_offset in range(-1, 2):
            # skip target itself
            if row_offset == 0 and col_offset == 0:
                continue
            # when target sits on the corners skip neighbour that does not exist
            if tgt_x + row_offset < 0 or tgt_x + row_offset > len(grid):
                continue
            if tgt_y + col_offset < 0 or tgt_y + col_offset > len(grid[0]):
                continue

            neighbour.append(grid[tgt_x + row_offset][tgt_y + col_offset])
    return neighbour

【讨论】:

  • 您能否通过提供一个非常简单的示例来更具体地说明您的目标!?!这称为Minimal Reproducible Example
  • 我的代码返回的和问题要求的一样
【解决方案3】:

如果保证您的正方形始终由小写字母的子集构成,并且对于扁平正方形中的每个字母 l 及其索引 ii = len(flat_square) - 1 | flat_square[i+1] = alphabet[i+1]

import string
def square_vals(v, square):
   x, y = (k:=string.ascii_lowercase.index(v))//(l:=len(square[0])), k%l
   if x:
      yield from square[x-1][y-1:y+2]
   yield from [*square[x][y-1:y], *square[x][y+1:y+2]]
   if x+1 < len(square):
      yield from square[x+1][y-1:y+2]
  
print(list(square_vals('j', [['a', 'b', 'c', 'd'], ['e', 'f', 'g', 'h'], ['i', 'j', 'k', 'l'], ['m', 'n', 'o', 'p']])))

输出:

['e', 'f', 'g', 'i', 'k', 'm', 'n', 'o']
   

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-09
    • 1970-01-01
    • 2020-06-22
    • 1970-01-01
    • 1970-01-01
    • 2015-01-31
    相关资源
    最近更新 更多