需要帮助了解此代码究竟是做什么的。我理解连接函数的作用。我正在努力了解格式函数正在做什么以及lambda函数正在做什么。
t = ''.join('{0}'.format(key, val) for key, val in sorted(c.items(), key = lambda x:x[-1], reverse = True))
答案 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;
<强>逐步:强>
lambda
将key
设为x[-1]
的最后一个元素(x
),其中x
是c.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']]