从列表中获取匹配字符串并创建新列表

Posted

技术标签:

【中文标题】从列表中获取匹配字符串并创建新列表【英文标题】:Take Matching Strings from List and Make New List 【发布时间】:2020-02-24 20:52:25 【问题描述】:

所以我有一个很长的项目列表,我需要为所有匹配的项目创建一个新列表。 这是一个简化的示例:

Mylist = [cat, cat, dog, dog, bear, camel, camel, camel]

所以我需要达到一个点:

Catlist = [cat,cat]

Doglist = [dog, dog]

Bearlist = [bear]

Camellist = [camel, camel, camel]

但诀窍是 Mylist 中的值会根据调用的数据集而改变,所以我永远不确定内容是什么。我只需要列出匹配的内容。

我原来的问题得到了回答;但是,我需要稍微扩大我的问题范围。假设我现在有一个名为 animal_data 的矩阵,它由 4 列组成:Animal、Xlocation、Ylocation 和 Zlocation,第一列包含原始 MyList 输入,其余三列包含字段中每只动物的 gps 位置.如何根据动物的类型将矩阵分成块?这是我目前所拥有的:

setofthis = set(animal_data[:,0])

IDS = 



for one in setofthis:
    ids = [one for i in animal_data[:,0] if i == one]
    IDS.update(one:ids)

for one in result:
    print(one, ":", IDS[one])

输入的数据集总是在变化,因此并非所有相同的动物每次都会出现在数据集中,也可能会将不同的动物添加到数据集中。

【问题讨论】:

欢迎来到 ***!请edit您的帖子包含您已经在解决方案尝试中编写的代码,以及有关您的数据集或其他因素的任何其他相关信息。 【参考方案1】:

您还可以将这段简单的代码与列表理解一起使用

Mylist = ["cat", "cat", "dog", "dog", "bear", "camel", "camel", "camel"]
setofthis = set(Mylist)

result = 

for one in setofthis:
    res = [one for i in Mylist if i == one]
    result.update(one: res)

for one in result:
    print(one, " : ",result[one])

你会得到这样的东西

dog  :  ['dog', 'dog']
bear  :  ['bear']
cat  :  ['cat', 'cat']
camel  :  ['camel', 'camel', 'camel']

【讨论】:

谢谢!这非常有帮助,但现在我需要让它变得更复杂一点才能真正解决问题的核心。假设 Mylist 由 4 列组成:Animal、Xlocation、Ylocation 和 Zlocation,第一列包含原始 MyList 输入,其余三列包含字段中每个动物的 gps 位置。如何根据动物的类型和包含动物及其位置将我的大型数据集分成更小的数据集? 没有特定的输入很难帮助你。信息animal,Xlocation,Ylocation,Zlocation当前存储在哪个数据结构中?字典列表? 如果你有一个这样的字典列表: l = [ 'animal' : 'cat', 'x': 2, 'y':4, 'z':1, 'animal...] - 列表推导仍然是最简单的方法,试试这个:result = [record for record in data if record["animal"] == "cat"]。这为您提供了一个仅包含“猫”记录的列表。问候 数据是用户输入的文本文件,为四列、行数变化的数组形式。行根据输入的文件而变化。我不知道我是否可以使用字典,因为数据集中可能包含的动物类型超过 200 项。我真的只需要写一些东西,在我的第一列中搜索相同的动物,并将动物的每个外观与其位置分组,但我尝试过的一切都不起作用。 (我想我不是最好的程序员哈。)再次感谢您的支持! 我想我在这里解释我的问题做得更好:***.com/questions/58663133/…如果你想看看。【参考方案2】:

对每个列表使用单独的变量并不是可行的方法——尤其是因为您不提前知道数据包含什么。您应该使用像字典这样的数据结构来使数据易于使用并将其保存在一个位置。

您可以使用itertools.groupby 将您的列表转换为列表字典。键是动物,值是动物列表。您需要确保对列表进行排序,以便将相同的动物归为一组:

from itertools import groupby

Mylist = ['cat', 'dog', 'bear', 'camel', 'camel','cat', 'camel','dog']
animals = k:list(g) for k, g in groupby(sorted(Mylist))

结果animals:

'bear': ['bear'],
 'camel': ['camel', 'camel', 'camel'],
 'cat': ['cat', 'cat'],
 'dog': ['dog', 'dog']

从这里您可以通过简单地索引字典来获取您的个人列表:

print(animals['cat']) # ['cat', 'cat']

【讨论】:

【参考方案3】:
Mylist = ['cat', 'cat', 'dog', 'dog', 'bear', 'camel', 'camel', 'camel']
cats = []
dogs = []
camels = []

for item in Mylist:
    if item == 'cat':
        cats += [item]
    if item == 'dog':
        dogs += [item]
    if item == 'camel':
        camels += [item]

print(cats)
print(dogs)
print(camels)

【讨论】:

以上是关于从列表中获取匹配字符串并创建新列表的主要内容,如果未能解决你的问题,请参考以下文章

在两个列表列表中查找匹配的字符串

从列表字典创建新的字符串列表(即从具有字符串列表作为值的字典)

匹配值列表中的字符串并创建新行

将列表与数据框列进行比较并使用数字创建新列

使用 Linq 从列表中获取所有匹配值的索引

通过数组过滤以匹配文本(jQuery / Javascript)