在其分类位置放置一个单词:真正的pythonic方法

时间:2015-09-21 20:11:22

标签: python sorting lambda

我正在编辑此查询,如果有人认为我有,请接受我的道歉 误导他们解决不同的问题。我有一个包含的文件 行星的名称,如下所示:

Neptune
Venus
Pluto
Uranus
Jupiter
Saturn
Mars
Earth
Mercury
Majikthise

请注意,其中一个不是行星(现在,让我们假设冥王星是一颗行星),我有一个命名行星列表,看起来像这样:

planets = ['Neptune', 'Venus', 'Pluto', 'Uranus', 'Jupiter', 'Saturn',
           'Mars', 'Earth', 'Mercury']

现在,我正在尝试检查文件是否包含任何非行星词,当我找到一个时,我将它移动到行星列表中的适当位置,例如列表是否已排序。所以如果我打印列表的输出应该是这样的:

['Neptune', 'Venus', 'Majikthise', 'Pluto', 'Uranus', 'Jupiter', 'Saturn',
 'Mars', 'Earth', 'Mercury']

请注意,在上面的输出中,“Majikthise”就在它的位置  在此列表 if 此列表已排序。我之前的印象是 我能够做到这一点,但我能够做到这一点,我想我能做到  由于我用来测试代码的输入的特殊性,即我使用过的 'Abracadabra'在这个名单中的自然位置将在开头(如果 排序)和我发现它的那些,但我正在做的只是追加 行星列入非行星,现在虽然我能够做我想做的事情 做,只有我不确定我是否以最经济的方式实现了这一目标。这是什么 我在做:

with open("./names.txt","r") as names:
    names = list(map(lambda x: x.rstrip(),names)
    planets.insert(sorted(names).index
            (list(filter(lambda x: x not in planets, names))[0],
                    list(filter(lambda x: x not in planets, names))[0])
    print(planets)

我的问题似乎从上次改变了,我现在基本上是在创造 两个列表,排序一个以查找非行星的排序位置,然后然后 将非行星插入未找到的行星列表中它将找到的索引 如果行星列表已经排序,它本身就可以了。

我现在可以做一些事情,而不是创建2个列表,python提供 内置组件中可以做到这一点的任何事情?

3 个答案:

答案 0 :(得分:2)

如果我理解正确,你想要排序非行星列表而不是行星列表。如果是这种情况,您可以轻松拆分为两个列表,然后对非行星列表进行排序并将其与行星列表合并。

planet_lists = [...]

with open('./names.text', 'r') as name_file:
     names = map(lambda name: name.strip(), name_file.readlines())
     non_planet_lists = filter(lambda name: name not in planet_lists, names)

result_list = sorted(non_planet_lists) + planet_lists

答案 1 :(得分:2)

列表推导

np=sorted([e for e in words if e not in planets]) 
p=[e for e in words if e in planets]
np+p

将行星中的非行星与给定的单词列表分开;排序非平面并与单词列表中给出的行星连接。单词可能不包括所有行星,因此也需要p。

答案 2 :(得分:1)

当您说 seek()回到流的开头再次使用名称时,您的指示是正确的。 @Kevin也说得对,当他说 names1 names2 是同一个对象时,你可以检查它是做一个简单的相等比较。在任何情况下,您都不需要其中任何一个,通过执行以下操作:

 with open("./names.txt", "r") as names:
        print(sorted(filter(lambda y: y not in planets, map(lambda x: x.rstrip(), names))) + planets)

希望这有助于