【问题标题】:Splitting a list by first character of each element按每个元素的第一个字符拆分列表
【发布时间】:2012-05-21 05:35:17
【问题描述】:

我有一个 Python 列表 mylist,其元素是一个包含字母和数字字符串的子列表。我想知道如何在不使用每个字符的单独语句/案例的代码的情况下,将mylist 拆分为字符串开头的字符。 假设我想将 mylist 拆分为列表 a, b, c:

mylist = [['a1'],['a2'],['c1'],['b1']]
a = [['a1'],['a2']]
b = [['b1']]
c = [['c1']]

重要的是我将它们保存为列表列表(即使每个子列表中只有一个元素)。

【问题讨论】:

  • 最好将结果存储在字典中,以第一个字母为键(根据 Óscar López 的回答),而不是单独的硬编码变量名称 a, b, c...;最好忽略这个要求。

标签: python list group-by split python-2.7


【解决方案1】:

这将起作用:

import itertools as it

mylist  = [['a1'],['a2'],['c1'],['b1']]
keyfunc = lambda x: x[0][0]

mylist = sorted(mylist, key=keyfunc)
a, b, c = [list(g) for k, g in it.groupby(mylist, keyfunc)]

仅当mylist 中的元素尚未按字符串开头的字符排序时,使用sorted() 的行才是必需的。

编辑:

正如 cmets 中所指出的,更通用的解决方案(不将变量数量限制为三个)将使用字典解析(在 Python 2.7+ 中可用),如下所示:

result_dict = {k: list(g) for k, g in it.groupby(mylist, keyfunc)}

现在答案由字典中的第一个字符键入:

result_dict['a']
> [['a1'],['a2']]

result_dict['b']
> [['b1']]

result_dict['c']
> [['c1']]

【讨论】:

  • 不错的解决方案,但也许应该明确一点,如果列表中有“d1”,代码会崩溃。也就是说,用result_dict = {k: list(g) for k, g in it.groupby(mylist, keyfunc)} 替换最后一行会更好,然后将字母作为键,将列表作为项目...
  • @deinonychusaur 感谢您的建议!我更新了我的答案。
  • 整洁。无需写mylist = sorted(mylist, ...),就地写mylist.sort(...)
【解决方案2】:

使用字典也可以

mylist = [['a1'],['a2'],['c1'],['b1']]

from collections import defaultdict

dicto = defaultdict(list)

for ele in mylist:
    dicto[ele[0][0]].append(ele)

结果:

>>> dicto
defaultdict(<type 'list'>, {'a': [['a1'], ['a2']], 'c': [['c1']], 'b': [['b1']]})

它没有给出您要求的确切结果;但是,访问与每个字母关联的列表列表非常容易

>>> dicto['a']
[['a1'], ['a2']]

【讨论】:

  • 我 +1 这个是因为它适用于任意数量的起始字符,所以你不限于abc
【解决方案3】:

你也可以通过一个简单的函数来获取这些子列表:

def get_items(mylist, letter):
  return [item for item in mylist if item[0][0] == letter]

表达式item[0][0] 只是表示获取当前项的第一个元素的第一个字母。然后您可以为每个字母调用该函数:

a = get_items(mylist, 'a')
b = get_items(mylist, 'b')
c = get_items(mylist, 'c')

【讨论】:

    猜你喜欢
    • 2023-03-12
    • 2020-03-25
    • 2020-07-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-12
    • 2015-01-12
    • 1970-01-01
    • 2021-04-21
    相关资源
    最近更新 更多