【问题标题】:How to compare a list of tuples based in the last element with conditions如何将基于最后一个元素的元组列表与条件进行比较
【发布时间】:2017-01-07 05:35:21
【问题描述】:

我正在尝试将基于当前列表中每个元组的最后一个元素的元组列表与某些条件进行比较。

所以,我有这样的列表:

index = [
        ([('T', (0, 0)), ('T', (1, 0)), ('T', (2, 0))], (1, 0)),
        ([('T', (0, 1)), ('M', (1, 1)), ('T', (2, 1))], (1, 1)),
        ([('T', (0, 2)), ('M', (1, 2)), ('T', (2, 2))], (1, 1)),
        ([('T', (0, 3)), ('M', (1, 3)), ('T', (2, 3))], (1, 1)),
        ([('T', (0, 4)), ('T', (1, 4)), ('T', (2, 4))], (1, 0))
        ]

预期的输出是:

[
    [
        [('T', (0, 0)), ('T', (1, 0)), ('T', (2, 0))],
        [('T', (0, 1)), ('M', (1, 1)), ('T', (2, 1))]
    ],
    [
        [('T', (0, 2)), ('M', (1, 2)), ('T', (2, 2))]
    ],
    [
        [('T', (0, 3)), ('M', (1, 3)), ('T', (2, 3))], 
        [('T', (0, 4)), ('T', (1, 4)), ('T', (2, 4))]
    ]
]

我要做的是比较元组的每个最后一个元素并应用一些条件。

条件是:

Compare Position k and k+1:
    1- if i found ((1,0) and (1,1)) or ((0,1) and (1,0)) 
       or ((1,1) and (1,0)) or ((1,1) and (0,1)) 
       => append to a list called `f_m` and go to `Position k+2`
    2- if i found (1,1) and (1,1) 
       => append to a list called `f_s` and go to `Position k+1`

0 <= i < len(index)

到目前为止我尝试过的,但输出错误的是:

def get_final(index, step = 2):
    k, i = 0, 0
    f_m, f_s = [], []
    while k < len(index):
        while i <= step:
            cond1 = (index[k+i][1][0] == 1 and index[k+i][1][1] == 0) and index[k+i+1][1][1] == 1
            cond2 = (index[k+i][1][0] == 0 and index[k+i][1][1] == 1) and index[k+i+1][1][0] == 0
            cond3 = (index[k+i][1][0] == 1 and index[k+i][1][1] == 1) and index[k+i+1][1][0] == 0

            if cond1:
                f_m += [index[k+i][0], index[k+i+1][0]]
                i += 2

            elif cond2:
                f_m += [index[k+i][0], index[k+i+1][0]]
                i += 2

            elif cond3:
                f_m += [index[k+i][0], index[k+i+1][0]]
                i += 2
            elif not cond1 and not cond2 and not cond3:
                f_s += index[k+i][0]
                i+=1

        k+=i

    print("f_m: ", f_m)
    print("f_s: ", f_s)

我的错误输出是:

f_m:  [
        [('T', (0, 0)), ('T', (1, 0)), ('T', (2, 0))],
        [('T', (0, 1)), ('M', (1, 1)), ('T', (2, 1))]
      ]
f_s:  [('T', (0, 2)), ('M', (1, 2)), ('T', (2, 2))]

【问题讨论】:

  • 投反对票的你能解释一下这个问题有什么问题吗?
  • 我认为步长在这里没有意义。因为如果你改变步长,i = i + step 的条件也会改变。因此,您还需要传递该参数,这不是动态的。
  • @MYGz 感谢您的评论。我会试着弄清楚。感谢您的回答和那里的提示。

标签: python list tuples


【解决方案1】:

这样的?

index = [
        ([('T', (0, 0)), ('T', (1, 0)), ('T', (2, 0))], (1, 0)),
        ([('T', (0, 1)), ('M', (1, 1)), ('T', (2, 1))], (1, 1)),
        ([('T', (0, 2)), ('M', (1, 2)), ('T', (2, 2))], (1, 1)),
        ([('T', (0, 3)), ('M', (1, 3)), ('T', (2, 3))], (1, 1)),
        ([('T', (0, 4)), ('T', (1, 4)), ('T', (2, 4))], (1, 0))
        ]

newlist = []
i=0
while i<len(index):
    if index[i][1]+index[i+1][1] in [(1,0,1,1), (0,1,1,0), (1,1,1,0), (1,1,0,1)]:
        newlist.append([index[i][0]] + [index[i+1][0]])
        i+=2
    elif index[i][1]+index[i+1][1] == (1,1,1,1):
        newlist.append([index[i][0]])
        i+=1

print newlist

输出:

[
     [
        [('T', (0, 0)), ('T', (1, 0)), ('T', (2, 0))],
        [('T', (0, 1)), ('M', (1, 1)), ('T', (2, 1))]
     ],

     [
        [('T', (0, 2)), ('M', (1, 2)), ('T', (2, 2))]
     ],

     [
        [('T', (0, 3)), ('M', (1, 3)), ('T', (2, 3))],
        [('T', (0, 4)), ('T', (1, 4)), ('T', (2, 4))]
     ]
 ]

【讨论】:

  • 谢谢。它确实输出了我所期望的。但是如果更改 step 怎么办?例如step = 4 ?
  • @nexus66 立即查看。根据您的要求调整函数内部的步长值。
  • 使用step = 4 打印IndexError。该步骤用于使用相同的逻辑一次比较例如 4 个元组。也许这是另一个问题。否则我会接受你的回答谢谢。
  • 顺便感谢您将元组与此列表进行比较的提示[(1,0,1,1), (0,1,1,0), (1,1,1,0), (1,1,0,1)]。我想我可以做剩下的。非常感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-23
  • 1970-01-01
  • 2019-11-14
  • 1970-01-01
  • 2018-03-21
  • 1970-01-01
相关资源
最近更新 更多