我想使用数字按降序排列类似于下一个元组的元组列表:
data = [('ralph picked',['nose','4','apple','30','winner','3']), ('aaron popped',['soda','1','爆米花','6','丸','4', '问题','29'])]
我想对嵌套列表进行排序,以便结果看起来像:
data2 = [('ralph picked', ['apple', '30', 'nose', '4', 'winner', '3']),
('aaron popped', ['question', '29', 'popcorn', '6', 'pill', '4', 'soda', '1'])]
我正在尝试使用此代码:
data2=[]
for k, v in data:
data2 = ((k, sorted(zip(data[::2], data[1::2]), key=lambda x: int(x[1]), reverse=True) ))
[value for pair in data2 for value in pair]
print(data2)
但我不断收到错误消息:
TypeError: int() argument must be a string or a number, not 'tuple'
我试图将int
中的key=lambda x: int(x[1])
重新排列为不同的东西,但我不断得到相同的消息,我对python很新,语法经常让我感觉到。关于如何解决这个问题的任何想法?我真的非常感谢你!
答案 0 :(得分:2)
不要试图一次性完成所有事情,而是让我们给出名字:
data = [('ralph picked', ['nose', '4', 'apple', '30', 'winner', '3']),
('aaron popped', ['soda', '1', 'popcorn', '6', 'pill', '4', 'question', '29'])]
data2 = []
for k, v in data:
new_list = sorted(zip(v[::2], v[1::2]), key=lambda x: int(x[1]), reverse=True)
flattened = [value for pair in new_list for value in pair]
new_tuple = (k, flattened)
data2.append(new_tuple)
产生
>>> print(data2)
[('ralph picked', ['apple', '30', 'nose', '4', 'winner', '3']),
('aaron popped', ['question', '29', 'popcorn', '6', 'pill', '4', 'soda', '1'])]
您需要区分data
和v
- 您只想对v
进行排序,并且您需要存储列表推导的结果,否则您只需要构建把它扔掉。
当你遇到语法问题时,将所有内容分成几部分并print
查看发生了什么。例如,您可以将new_list
分解为
words = v[::2]
numbers = v[1::2]
pairs = zip(words, numbers)
sorted_pairs = sorted(pairs, key=lambda x: int(x[1]), reverse=True)
和sorted_pairs
确实是new_list
。