我遇到了对称问题'我希望你能提供帮助。
我有一个类似
的列表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
但这不适合我。 救命啊!
答案 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