代码之家  ›  专栏  ›  技术社区  ›  helpermethod

用更像蟒蛇的方式来写这个表达式?

  •  8
  • helpermethod  · 技术社区  · 14 年前

    我得到的是:

    list_1 = []
    list_2 = []
    
    for word in words:
      list_1.append(word) if word[0] == 'x' else list_2.append(word)
    
    return sorted(list_1) + sorted(list_2)
    

    但我觉得有一个更优雅的方法来做这个。。。

    例子: ['mix', 'xyz', 'apple', 'xanadu', 'aardvark'] ['xanadu', 'xyz', 'aardvark', 'apple', 'mix'] .

    8 回复  |  直到 14 年前
        1
  •  41
  •   SilentGhost    14 年前
    >>> words = ['xoo', 'dsd', 'xdd']
    >>> sorted(words, key=lambda x: (x[0] != 'x', x))
    ['xdd', 'xoo', 'dsd']
    

    说明:key函数返回一对(元组)。第一个元素是 False True ,这取决于字符串中的第一个字符是否 'x' . 排序之前 真的 ,所以字符串以 “x” 将是排序输出中的第一个。元组中的第二个元素将用于比较第一个元素中相同的两个元素,因此所有以 “x” “x”

        2
  •  9
  •   Glenn Maynard    14 年前

    第一:当你的意思是“干净”时,不要说“蟒蛇”。这只是一个俗语。

    for word in words:
        if word[0] == 'x':
            list_1.append(word)
        else:
            list_2.append(word)
    

    您可以进一步改进它——使用这样的三元表达式很好:

    for word in words:
        target = list_1 if word[0] == 'x' else list_2
        target.append(word)
    

    如果 words 是容器而不是迭代器,可以使用:

    list_1 = [word for word in words if word[0] == 'x']
    list_2 = [word for word in words if word[0] != 'x']
    

    result = sorted(words)
    result = sorted(result, key=lambda word: word[0] != 'x')
    

    它首先正常排序,然后使用Python sorts的stable属性将以“x”开头的单词移到前面,而不改变顺序。

        3
  •  6
  •   extraneon    14 年前
    words = ['xoo', 'dsd', 'xdd']
    list1 = [word for word in words if word[0] == 'x']
    list2 = [word for word in words if word[0] != 'x']
    
        4
  •  5
  •   Community CDub    8 年前

    应该指出的是 sorted 在Python2.4中添加。如果您想要一个较短的版本,这是一个有点干净,有点向后兼容,您可以选择使用 .sort() 直接关闭的功能 list . x[0] 在这种情况下样式数组索引语法(有很多例子)。 .startswith() should be used instead, as is properly used in Tony Veijalainen's answer

    >>> words = ['mix', 'xyz', '', 'apple', 'xanadu', 'aardvark']
    >>> words.sort(key=lambda x: (not x.startswith('x'), x))
    >>> words
    ['xanadu', 'xyz', '', 'aardvark', 'apple', 'mix']
    

    唯一的缺点是你正在改变给定的对象。这可以通过预先对列表进行切片来解决。

    >>> words = ['mix', 'xyz', '', 'apple', 'xanadu', 'aardvark']
    >>> new_words = words[:]
    >>> new_words.sort(key=lambda x: (not x.startswith('x'), x))
    >>> new_words
    ['xanadu', 'xyz', '', 'aardvark', 'apple', 'mix']
    >>> words
    ['mix', 'xyz', '', 'apple', 'xanadu', 'aardvark']
    
        5
  •  2
  •   Frost.baka    14 年前
    words = ['xoo', 'dsd', 'xdd']
    list1=filter(lambda word:word[0]=='x',words)
    list2=filter(lambda word:word[0]!='x',words)
    
        6
  •  2
  •   Tony Veijalainen    14 年前

    重新发送变量SilenGhosts代码(可以随意复制,silenghost)作为代码而不是命令提示符日志

    notinorder = ['mix', 'xyz', '', 'apple', 'xanadu', 'aardvark']
    print sorted(notinorder, key = lambda x: (not x.startswith('x'), x))
    
        7
  •  1
  •   user225312    14 年前
    >>> x = ['abc', 'xyz', 'bcd', 'xabc']
    >>> y = [ele for ele in x if ele.startswith('x')]
    >>> y
    ['xyz', 'xabc']
    >>> z = [ele for ele in x if not ele.startswith('x')]
    >>> z
    ['abc', 'bcd']
    
        8
  •  0
  •   Pete Fein    14 年前

    更多关于原始解决方案的内容:

    l1=[]
    l2=[]
    for w in sorted(words):
        (l1 if w[0] == 'x' else l2).append(w)
    l1.extend(l2)
    return l1