理解Python

时间:2018-02-07 04:05:29

标签: python python-3.x

需要帮助了解此代码究竟是做什么的。我理解连接函数的作用。我正在努力了解格式函数正在做什么以及lambda函数正在做什么。

t = ''.join('{0}'.format(key, val) for key, val in sorted(c.items(), key = lambda x:x[-1], reverse = True))

4 个答案:

答案 0 :(得分:1)

这很有趣。人们不应该专业地写这样的东西,特别是没有评论来解释它的作用。

计数器是一个可迭代的,由另一个迭代构成,其中键是原始可迭代中的唯一元素,以及每个元素在原始可迭代中出现的次数。例如:

l1 = ["a"] * 4 + ["b"] * 2 + ["c"] * c + ["d"]
c1 = Counter(l1)
print c1
#Counter({'a': 4, 'c': 3, 'b': 2, 'd': 1})

Counter.items()将计数器转换为表单(键,值)的元组列表。

sorted(c.items(), key = lambda x:x[-1], reverse = True)

line获取元组列表,并按可迭代的value元素按降序对它们进行排序。从上面的例子:

l2 = sorted(c1.items(), key = lambda x:x[-1], reverse = True)
print l2
#[('a', 4), ('c', 3), ('b', 2), ('d', 1)]

现在列表已排序,它会遍历列表中的每个键值对。在这种情况下,String.format用传递的第一个参数替换{0}。他们可能通过两个元素来迷惑你。它最终做的就是按原始可迭代中出现次数的降序附加每个键。

s1 = ''.join('{0}'.format(key, val) for key, val in l2)
print s1
#acbd

这在功能上等同于

''.join(p[0] for p in sorted(c1.items(), key = lambda x:x[-1], reverse = True))

String.format基本上什么也没做。

答案 1 :(得分:1)

<强> TL; DR:

lambda只是指定(事前)查看或使用内容的好方法。否则你将无法指定:

&#34;我想对可迭代的每个元素的索引1进行排序&#34;

<强>逐步:

lambdakey设为x[-1]的最后一个元素(x),其中xc.items()内的元素。

基本上,流程是这样的:

首先执行

sorted();它将对c.items()

的内容进行排序

但它又是什么呢? lambda x:x[-1]表示key是可迭代c.items()中每个元素的最后一个元素。所以如果:

c.items() == ['123', '456', '789']

然后key的{​​{1}}将成为sorted(),并将在'3', '6', '9'中排序。

但由于reverse = True可能代表c.items()内容,dict表示每个元素解包为2个不同的变量:for key, val。所以我之前的例子更像是:

key, val

c.items() == [['this', 1], ['that', 2], ['thus', 0]允许对lambda进行排序。

您已表示理解1, 2, and 0,但join仅使用format的值;因此key

以下是您正在进行的示例:

{0}

由于>>> c = {'this': 136, 'that': 133, 'thus': 156} >>> c.items() dict_items([('this', 136), ('that', 133), ('thus', 156)]) >>> t = ''.join('{0}'.format(key, val) for key, val in sorted(c.items(), key = lambda x:x[-1], reverse = True)) >>> t 'thusthisthat' sorted()作为lambda返回,我们知道key将是每个元素的最后一个(key)元素在iterable([-1])中。这意味着我们将自动排序升序,但由于我们有c.items(),我们将排序降序

因此,以上就是你得到的!

答案 2 :(得分:0)

请参阅documentation for format string syntax: 格式字符串select max(case when rn = 1 then CodeDt end) , CodeHeader , max(case when rn = 1 then Item end) , max(case when rn = 2 then Item end) , max(case when rn = 1 then Qty end) from ( select *, rn = row_number() over (partition by CodeHeader order by CodeDt) from myTable ) t group by CodeHeader 包含一个替换字段。 "{0}"引用第一个(零索引)位置参数(0中的key)。正如ShadowRanger在评论中提到的那样,不使用第二个位置参数'{0}'.format(key, val)

请参阅documentation for sorted: lambda函数作为val参数传递。基本上,这是一种控制key如何对迭代进行排序的方法。来自文档:

  

sorted指定一个参数的函数,用于从每个列表元素中提取比较键:key。默认值为key=str.lower(直接比较元素)。

答案 3 :(得分:0)

format是一种字符串类型的方法,例如:

a = '{0} is very {1}'.format('Tom','tall')

输出的将是'汤姆很高' 和lambda做的是使用一次性函数

lambda x : x[-1]实际上与

做同样的事情
def function (x):
  return x
代码sorted(c.items(), key = lambda x:x[-1], reverse = True)中的

通过(c.item中的最后一项)和反向排序c.items 例如 排序后c.items = [['a','1'],['b','0'],['c','3']]

[['c', '3'], ['a', '1'], ['b', '0']]