我试图在此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)。
答案 0 :(得分:7)
好的,我们来做一些小组理论:
假设您可以将您的数字x分解为数字X [i](删除set
实际上是微不足道的,当然其他人也会这样做)。
然后我们知道十进制系统如何工作,
我们需要找到的是一个函数y = f(x),它将相同数字的排列的x'映射到相同的y,但x'不是不同y的排列。
我们可以使用这样的事实:不同数字的素数因子化是不同的,并且简单地找到不是数字(并且大于数字*数字的长度)的素数的指数的总和。如果我们假设少于9位,这会变得更容易,所以我们会这样做。
对于这个例子,让我们坚持使用17(这进一步限制了我们的位数,但是很好)。
所以,现在你可以在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行代码即可完成此操作:
所以整个程序看起来像这样:
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]
>>>