使用调用每个索引的第二个元素的语句从列表创建列表

时间:2017-07-18 22:23:12

标签: python list sorting if-statement

这是我最初的清单:

    >>> List1 = (List.most_common())
    >>> print (List1)
    >>> [('d', 17), ('a', 17), ('c', 17), ('q', 6), ('w', 4), ('s', 3), ('i', 2), ('p', 2), ('f', 2), ('h', 2), ('n', 2), ('g', 2), ('j', 2), ('u', 1), ('b', 1)]

从文本生成,它是每个字母在文本中出现的次数。

    >>> HighestFactor = List1[0][1]

HighestFactor = 17是我得到的,因为字母出现的最高数字总是会在那个位置上

在这种情况下,我需要做的是获得最多的一个(" D"," A"和#34; C")如果有的话如果不是仅仅打印字母,则使用相同数量的外观按字母顺序对它们进行排序。 我首先创建的列表只有那些等于HighestFactor的列表,所以我可以按字母顺序对该列表进行排序并获得我需要的内容

    >>> Last_list = for (x,y) in List1
                     if y = HighestFactor:

我认为这是我能从解决方案中得到的最接近的,但它没有用。

将其视为:

(' d',17)=(x,y)

(' a',17)=(x,y)

(' c',17)=(x,y)

17 = y = HighestFactor

列表中只包含y = HighestFactor的元素。

结果应该是:

    >>> print Last_list
    >>> [('d', 17), ('a', 17), ('c', 17)]

6 个答案:

答案 0 :(得分:2)

max_val = max(x, key= lambda y : y[1])[1]
max_lst = filter(lambda y: y[1] == max_val, x)
sorted_lst = sorted(max_lst, key = lambda z : z[0])

第一行选择列表中的最大值,第二行创建一个仅包含等于最大值的列表,第三行按字母顺序对结果进行排序。

答案 1 :(得分:2)

假设数据未排序,

data = [('d', 17), ('a', 17), ('c', 17), ('q', 6), ('w', 4), ('s', 3), ('i', 2), ('p', 2), ('f', 2), ('h', 2), ('n', 2), ('g', 2), ('j', 2), ('u', 1), ('b', 1)]

max_count = max(data, key=lambda datum: datum[1])[1]
tops = sorted(alphabet for alphabet, count in data if count == max_count)

由于您希望对输出进行排序...

答案 2 :(得分:2)

让我们稍微分解一下。

Counter调用判断,您看起来好像是从most_common()实例开始。这是一个好的开始。 most_common按计数器值排序,这是您想要的。

要仅使用共享最高价值的most_common()元素,我会使用itertools.takewhile()

highest_count_iter = itertools.takewhile(lambda x: x[1] == counter.most_common(1)[1], counter.most_common())

或者,如果您希望稍微打破一下:

elements = counter.most_common()
highest_count = elements[0][1]
highest_count_iter = itertools.takewhile(lambda x: x[1] == highest_count, elements)

这将为您提供一个迭代器,它只产生共享最高值的对。

然后,您可以在不使用排序键的情况下对此进行排序,因为Python元组按元素排序,并且您知道所有元素的第二个值共享相同的计数:

print sorted(highest_count_iter)

答案 3 :(得分:1)

鉴于您可以获得final = list(filter(lambda x: x[1] == HighestFactor, List1)) 您想要使用列表理解:

{{1}}

使用python功能内置函数的更快方法可能是:

{{1}}

答案 4 :(得分:1)

from itertools import takewhile
LastLettersList = zip(*takewhile(lambda x:x[-1] == HighestFactor,List1))[0]

可能?

答案 5 :(得分:1)

这应该这样做:

>>> a = [('d', 17), ('a', 17), ('c', 17), ('q', 6), ('w', 4), ('s', 3), ('i', 2), ('p', 2), ('f', 2), ('h', 2), ('n', 2), ('g', 2), ('j', 2), ('u', 1), ('b', 1)]
>>> mx = max(map(lambda x: x[1], a))
>>> sorted(filter(lambda x: x[1] == mx, a), key=lambda x: x[0])
[('a', 17), ('c', 17), ('d', 17)]