在函数调用中拆分元组

时间:2016-06-02 18:03:14

标签: python sorting

更新:通过参考上一篇文章,我的最终目标更加清晰。 Combing 2D list of tuples and then sorting them in Python

使用以下代码行

result = list(zip(*sorted(zip(l1, l2, l3, files_good_list), section(l1), key = lambda x: float(x[0]))))

哪个部分

 def section(s):
     return[int(_) for _ in s.split(".")]

和l1,l2,l3,files_good_list是字符串列表。

我的目标是将这四个列表组合起来,然后按l1排序。哪里

l1 = ['1', '1.1', '1.2', '1.10', '2.1', '3.1', '1', '1.1', '1.2', '1.3', '1.4', '2', '2.1', '2.10', '3', '3.1', '3.2', '3.3', '3.4', '3.5', '3.6', '3.7', '3.8']

如果我使用

,我的代码可以正常工作

result = list(zip(* sorted(zip(l1,l2,l3,files_good_list),key = lambda x:float(x [0]))))

但它确实将l1排序为' 1',' 1.1',1.10',' 1.2'在哪里我希望l1排序为' 1',' 1.1',' 1.2',' 1.10'。这就是为什么我试图使用函数部分按我想要的顺序排序。

我在这篇文章的答案中发现了类似How do I sort a list of section numbers in Python?

的部分

然而,当我尝试将其作为参数传递时,我得到了这个错误。

 Traceback (most recent call last):
  File "<ipython-input-422-bbd574034cbd>", line 1, in <module>
     runfile('C:/Users/justin.white/Documents/Work/Regex_try.py', wdir='C:/Users/justin.white/Documents/Work')
  File "C:\Users\justin.white\AppData\Local\Continuum\Anaconda3\lib\site-packages\spyderlib\widgets\externalshell\sitecustomize.py", line 699, in runfile
     execfile(filename, namespace)

  File "C:\Users\justin.white\AppData\Local\Continuum\Anaconda3\lib\site-packages\spyderlib\widgets\externalshell\sitecustomize.py", line 88, in execfile
    exec(compile(open(filename, 'rb').read(), filename, 'exec'), namespace)
   File "C:/Users/justin.white/Documents/Work/Regex_try.py", line 84, in <module>
     result = list(zip(*sorted(zip(l1, l2, l3, files_good_list), section(l1), key = lambda x: float(x[0]))))
  File "C:/Users/justin.white/Documents/Work/Regex_try.py", line 82, in section
     return[int(_) for _ in s.split(".")]
 AttributeError: 'list' object has no attribute 'split'

但是当我做的时候

sorted(l1, key=section)

我没有收到错误,它按照我需要的顺序对其进行排序。所以我的问题是为什么我不能把它分成拉链时的分段?

如果您需要任何澄清,请告诉我。感谢

2 个答案:

答案 0 :(得分:2)

section接受一个包含由点分隔的整数的字符串,但在您的代码中,您将传递一个列表。使用它的正确方法是:

result = list(zip(*sorted(zip(l1, l2, l3, files_good_list), key = lambda x: section(x[0]))))

但话又说回来,我不确定你要对该代码部分做些什么。

一条建议是避免使用这样的单行程序并将代码分解为更易读的块。这使得人们很难理解你想要做的事情。

答案 1 :(得分:0)

我会给你一个你想要的快速例子。几乎你有一个部分的两个部分(至少在这个例子中)。您有x.y其中x可以是任意数字,我将假设y可以是1-10。在这种情况下,您可以制作自定义比较函数,将x的最大值加y

这样做会这样做:

l1 = ['1', '1.1', '1.2', '1.10', '2.1', '3.1', '1', '1.1', '1.2', '1.3', '1.4', '2', '2.1', '2.10', '3', '3.1', '3.2', '3.3', '3.4', '3.5', '3.6', '3.7', '3.8']
def section(s):
    # Set the inital values
    s1, s2 = 0, 0
    # If there is a `.` then we have a subsection
    if s.find('.') != -1:
        s1, s2 = s.split('.')
        s1, s2 = int(s1), int(s2)
    # Otherwise it's whatever value is there
    else:
        s1 = int(s)
    # Perform the actual weighting of the section and subsection
    return s1*10+s2

print(sorted(l1, key=section))
# Prints ['1',
 '1',
 '1.1',
 '1.1',
 '1.2',
 '1.2',
 '1.3',
 '1.4',
 '1.10',
 '2',
 '2.1',
 '2.1',
 '2.10',
 '3',
 '3.1',
 '3.1',
 '3.2',
 '3.3',
 '3.4',
 '3.5',
 '3.6',
 '3.7',
 '3.8']