如何在列表中查找排列然后删除它们?

时间:2016-08-27 08:46:21

标签: python permutation

我试图在此txt文件中找到另一个数字的排列,然后将它们添加到列表中:

167
168
148
143
289
194 
683
491

在此文件中,排列为491和194。

这是我的代码:

numberList = []

file = open("file.txt", "r")
for line in file:
    numberList.append(line)

现在他们已添加到numberList,如何从此列表中删除它们(491和194)。

3 个答案:

答案 0 :(得分:7)

好的,我们来做一些小组理论:

假设您可以将您的数字x分解为数字X [i](删除set实际上是微不足道的,当然其他人也会这样做)。

然后我们知道十进制系统如何工作,

$$x = \sum_{i=0}^{\log_{10} x} x[i] 10^i$$

我们需要找到的是一个函数y = f(x),它将相同数字的排列的x'映射到相同的y,但x'不是不同y的排列。

我们可以使用这样的事实:不同数字的素数因子化是不同的,并且简单地找到不是数字(并且大于数字*数字的长度)的素数的指数的总和。如果我们假设少于9位,这会变得更容易,所以我们会这样做。

对于这个例子,让我们坚持使用17(这进一步限制了我们的位数,但是很好)。

$$y= f(x) = \sum_{i=0}^{6} 17^{x[i]}$$

所以,现在你可以在python class permutation(object): def __init__(self, x): """ we'll assume x is an integer """ digits = str(x) self.original = x self._hash = sum([17**int(digit) for digit in digits]) def __hash__(self): return self._hash def __eq__(self,other): return self._hash == hash(other) def __ne__(self,other): return self._hash != hash(other) permutation_free = set() file = open("file.txt", "r") for line in file: x = int(line) permutation_free.add(permutation(x)) print [perm.original for perm in permutation_free] 中将该函数用作比较键并完成。

所以,非常天真(并且非常未经测试):

public void greetInEnglish() {
    interface HelloThere {
       public void greet();
    }
    class EnglishHelloThere implements HelloThere {
        public void greet() {
            System.out.println("Hello " + name);
        }
    }
    HelloThere myGreeting = new EnglishHelloThere();
    myGreeting.greet();
}

编辑:甚至测试过它。

答案 1 :(得分:4)

似乎有两个问题:如何从文本文件中读取数字,以及如何检测和过滤掉重复项w.r.t.排列。首先,您可以使用strip删除\n并转换为int以获取实际数字(尽管使用int时,第一步并非如此必要)。为了过滤排列,我建议使用字典,按排序顺序将每个数字与自身相关联。由于排序后每个排列都是相同的,因此这将组合彼此排列的数字。如果您想保留原始订单,请使用collections.OrderedDict

import collections
numbers = collections.OrderedDict()

with open("file.txt") as f:
    for line in map(str.strip, f):
        print(line)
        key = ''.join(sorted(line))
        if key not in numbers:
            numbers[key] = []
        numbers[key].append(int(line))
    print(numbers)

之后,numbers

OrderedDict([('167', [167]), ('168', [168]), ('148', [148]), ('134', [143]), ('289', [289]), ('149', [194, 491]), ('368', [683])])

要获得没有“置换 - 重复”的有序数字序列,只需从每个值列表中获取第一个元素:

>>> [v[0] for v in numbers.values()]
[167, 168, 148, 143, 289, 194, 683]

如果你想删除两者重复项,你可以添加一致的条件:

>>> [v[0] for v in numbers.values() if len(v) == 1]
[167, 168, 148, 143, 289, 683]

答案 2 :(得分:1)

因此,您只需再添加3行代码即可完成此操作:

  1. 对列表中的每个项目进行排序,以便排列匹配
  2. 检查列表中的每个项目以查看排列的位置,并创建这些索引的列表
  3. 创建新列表不要添加标识为排列的索引:
  4. 所以整个程序看起来像这样:

    numberList = []
    
    file = open("file.txt", "r")
    for line in file:
        numberList.append(line.strip())
    
    x = [sorted(y) for y in numberList]
    indices = [i for i, item in enumerate(x) if x.count(item) > 1]
    numberList = [item for i, item in enumerate(numberList) if i not in indices]
    

    结果:

    >>> numberList
    [167, 168, 148, 143, 289, 683]
    >>>