【问题标题】:Python loop through list levelsPython循环遍历列表级别
【发布时间】:2020-09-08 09:57:20
【问题描述】:

我正在尝试循环并合并两个如下所示的列表:

T1 = [[['a',  1], ['c', 3]], [['e',  5], ['g', 7]], [['i',  9],['j', 11]]]
T2 = [[['m',  1], ['n', 5]], [['q',  7], ['r', 7]], [['t',  9],['u', 11]]]

例如,T1[0] = [['a', 1], ['c', 3]] T2[0] = [['m', 1], ['n', 5]]

我正在编写本质上是一种合并算法的东西,我将 T1[0][0](1)中每个列表中的第二个元素与 T2[0][0] 中的第二个值(所以 1再次)。基本上我想要的是 T1[0][0][0] 和 T2[0][0][0]。如果它们匹配,我将这两个值合并为一个元组 {'a', 1, 'm'} (如果它使事情变得更容易,也可以是一个列表)。

我的困惑源于这样一个事实,即我不知道如何在不运行 3 次的情况下最好地循环 T1 和 T2:(T1[0], T2[0]), (T1[1], T2[ 1]), (T1[2], T2[2])

有没有办法优雅地循环遍历 T1 和 T2 以便我可以遍历 T1 和 T2 中的每个子列表并执行检查和合并?

注意:数据已经排序,我不想使用库。我想知道我自己能不能做到这一点。

##更新## 所以我知道这是一个for 循环,但是下面的代码是我所能得到的,它给我一个list index out of range 如下所示

result = []
i = j = 0

while True:
    for s_T1 in T1:
        for s_T2 in T2:
            if s_T1[i][1] < s_T2[j][1]: ### error at this line
                i = i + 1

            elif  s_T1[i][1] > s_T2[j][1]:
                j = j + 1

            elif s_T1[i][1] == s_T2[j][1]:
                result.append(s_T1[i][0], str(s_T1[i][0), s_T2[j][0])
                i = i + 1
                j = j + 1
                
            if i == len(T1) or j == len(T2):
                break

return result

代码应该返回的是:

[[['a', 1, 'm']], [['g', 7, 'q'], ['g', 7, 'r']], [['i', 9, 't'], ['j', 11, 'u']]]

因此,查看 T1 中 ['e', 5] 中的整数,将其与 T2 中的 ['q', 7] 进行比较,因为 5 小于 7,所以移动到 T1 中的下一个值。如果它们匹配,则追加。反之亦然 - 如果 T1 中的值大于 T2 中的值,则移至 T1 中的下一个值。

【问题讨论】:

  • 请用您尝试过的代码更新您的问题。
  • 根据您的示例输入,还使用所需的输出更新您的问题。
  • 两个列表中['e', 5, 'n'] 的结果不在同一个“索引”中,这是一个错误,还是应该将T1 中的每个索引与T2 的每个索引进行比较?
  • @quamrana 我已经更新了我的问题。对我的循环的任何帮助也很感激
  • @soapycat 然后我认为['g', 7, 'q'] 也不应该在那里正确吗?

标签: python python-3.x list loops


【解决方案1】:

这应该可行:

def task(T1,T2):
    result = []
    for i in range(len(T1)):
        for k in range(2):
            for l in range(2):
                if T1[i][k][1]==T2[i][l][1]:
                    result.append([T1[i][k][0], T1[i][k][1],T2[i][l][0]]) 
    return result

task(T1,T2)

运行时结果为:

[['a', 1, 'm'], ['g', 7, 'q'], ['g', 7, 'r'], ['i', 9, 't'], ['j', 11, 'u']]

如您的问题所示

【讨论】:

  • 你可以做类似T2[i][l][1] ??每次我尝试这样做时,它都会给我一个错误!一定没有做对。这是标准做法吗?
  • 只要数据结构(它的深度)允许,您绝对可以做到。你测试过答案吗?如果是,请接受一些,以防它正确回答问题。干杯
【解决方案2】:

zip 将多个可迭代对象联系在一起,这样您就可以锁定步长地遍历它们,这似乎是您正在寻找的:

>>> result = []
>>> for i, j in zip(T1, T2):
...   sub = []
...   for x, y in zip(i, j):
...     if x[1] == y[1]:
...       sub.append((x[0], x[1], y[0]))
...   if sub:
...     result.append(sub)
...
>>> result
[[('a', 1, 'm')], [('g', 7, 'r')], [('i', 9, 't'), ('j', 11, 'u')]]

【讨论】:

  • 不完全,我很抱歉我不是很清楚我是如何循环的。我已经更新了循环和匹配要求。
猜你喜欢
  • 2018-10-26
  • 2019-04-15
  • 1970-01-01
  • 1970-01-01
  • 2014-06-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多