Python:在列表列表中查找对称性

时间:2016-02-22 13:46:01

标签: python list search indexing

我遇到了对称问题'我希望你能提供帮助。

我有一个类似

的列表
list = [[1,2,3,4,5,6],[2,4,6,8,10,12],[1,4,5,2,3,6],[1,2,3,4,9,3]]

我希望确定此列表中每个元素的对称性。在此示例中,如果我查看列表中的第一个元素(= i)并使用i[1:3]切换i[3:5],那么我想在列表的其余部分搜索匹配项。我们可以看到切换后list[3]匹配i。 你能帮我写一个快速的解决方案吗?例如: 我有一个函数来切换看起来像这样的元素:

def switch(i):
    i[1:3], i[3:5] = i[3:5],i[1:3]
return i

然后我有一个看起来像

的循环
no_sym = []
for i in list:
    sym = [x for x in list if x not in no_sym and not no_sym.append(switch(i))]
    continue 

但这不适合我。 救命啊!

4 个答案:

答案 0 :(得分:1)

这一行不应该有append

sym = [x for x in list if x not in no_sym and not no_sym.append(switch(i))]

foo.append(bar)会返回None,因此代码相当于[x for x in list if x not in no_sym and not None],它允许no_sym以外的所有项目都进入sym。< / p>

此外,您的swtich函数实际上修改了它的参数,这可能不是您想要的。检查:

>>> ls = [[1,2,3,4,5,6], [2,4,6,8,10,12], [1,4,5,2,3,6], [1,2,3,4,9,3]]
>>> switch(ls[0]) == ls[2]  # seems harmless
True
>>> switch(ls[0]) == ls[2]  # but ls[0] has been modified, so the next test fails
False

为避免这种情况,switch应该复制参数列表:

def switch(ls):
    copy_ls = ls[:]
    copy_ls[1:3], copy_ls[3:5] = copy_ls[3:5], copy_ls[1:3]
    return copy_ls

现在,如果您希望每个项目及其“对称”兄弟作为sym中的元组,这将有效:

>>> ls = [[1,2,3,4,5,6], [2,4,6,8,10,12], [1,4,5,2,3,6], [1,2,3,4,9,3]]
>>> sym = [(x, switch(x)) for x in ls if switch(x) in ls[ls.index(x)+1:]]
>>> sym
[([1, 2, 3, 4, 5, 6], [1, 4, 5, 2, 3, 6])]

此外,您可能不应该使用list作为变量名称,因为它会影响内置函数。

答案 1 :(得分:1)

这是你想要的。我不确定我是否理解你的意思是&#34;对称&#34;

_list = [[1,2,3,4,5,6],[2,4,6,8,10,12],[1,4,5,2,3,6],[1,2,3,4,9,3]]

def switch(i):
     result = i[:]
     result[1:3], result[3:5] = result[3:5], result[1:3]
     return result

sym = [(x, switch(x)) for x in _list if switch(x) in _list]

print sym
  
    

[([1,2,3,4,5,6],[1,4,5,2,3,6]),([1,4,5,2,3,6],[ 1,2,3,4,5,6])]

  

答案 2 :(得分:0)

我认为你没有把开关写得正确。我完全不明白为什么 你使用(不是no_sym.append(switch(i)))。

答案 3 :(得分:0)

在您的示例中,您似乎假设索引以1开头。实际上,索引从0开始。因此,您的switch函数应该看起来像

def switch(i):
    i[1:3], i[3:5] = i[3:5], i[1:3]
return i

此外,您需要提供更具体的“对称性”定义。如果len(a)= len(b)和a [i] == b [i]&amp;&amp;和你的定义是'元组a和b是对称的吗? a [ - (i + 1)] == b [ - (i + 1)]或a [i] == b [ - (i + 1)]&amp;&amp; a [ - (i + 1)] == b [i]对于i> = 0和i