Python 返回一个列表中的索引范围,以从另一个列表中获取值

Python 返回一个列表中的索引范围,以从另一个列表中获取值,python,list,indices,Python,List,Indices,我有两个大小相同的列表,一个具有数据类型(连续出现): 第二个列表是关于数据的: data = ["xx","tr","kl","ut","ew","uy","lp","eq","aq"] 从数据列表中,我知道“xx”、“tr”是“vigi”和“kl”、“ut”、“ew”是“水果”等等 我每次需要的是将数据分成两个数

我有两个大小相同的列表,一个具有数据类型(连续出现):

第二个列表是关于数据的:

data = ["xx","tr","kl","ut","ew","uy","lp","eq","aq"]
从数据列表中,我知道
“xx”、“tr”
“vigi”
“kl”、“ut”、“ew”
“水果”
等等

我每次需要的是将
数据
分成两个数据集,其中包括:

data1 = data[indices for type "vigi"]
data2 = data[indices for the remaining (i.e. data for "fruits" and "nothing")]
第二次将有:

data1 = data[indices for type "fruits"]
data2 = data[indices for the remaining (i.e. data for "vigi" and "nothing")]
等等

请提供任何帮助。

您可以使用
zip()
函数:

types = ["vigi","vigi","fruits","fruits","fruits","nothing","nothing","nothing","nothing"]
data = ["xx","tr","kl","ut","ew","uy","lp","eq","aq"]


data1 = [d for t, d in zip(types, data) if t == 'vigi']
data2 = [d for t, d in zip(types, data) if t != 'vigi']

print(data1)
print(data2)
印刷品:

['xx', 'tr']
['kl', 'ut', 'ew', 'uy', 'lp', 'eq', 'aq']

其他版本(仅在列表上迭代一次):


以下是如何使用
zip()

输出:

['xx', 'tr']
['kl', 'ut', 'ew', 'uy', 'lp', 'eq', 'aq']
['xx', 'tr']
['kl', 'ut', 'ew', 'uy', 'lp', 'eq', 'aq']

另一种方法是使用
enumerate()

输出:

['xx', 'tr']
['kl', 'ut', 'ew', 'uy', 'lp', 'eq', 'aq']
['xx', 'tr']
['kl', 'ut', 'ew', 'uy', 'lp', 'eq', 'aq']
但是当只需要一个时,它会在
数据
列表上迭代两次。相反,要提高时间复杂性,请使用for循环:

types = ["vigi","vigi","fruits","fruits","fruits","nothing","nothing","nothing","nothing"]
data = ["xx","tr","kl","ut","ew","uy","lp","eq","aq"]

data1 = []
data2 = []

for i,d in enumerate(data):
    if types[i] == 'vigi':
        data1.append(types[i])
    elif types[i] in ['fruits','nothing']:
        data2.append(types[i])

print(data1)
print(data2)

zip()
选项也是如此(参见@AndrejKesely对for循环的回答)。

单循环解决方案的变体(参见其他答案)。依赖于这样一个事实,即布尔值在转换为
int
时将变为
0
1
。可能被认为是黑客,但包括娱乐

data1, data2 = [], []
out = (data2, data1)
for t, d in zip(types, data):
    out[t == 'vigi'].append(d)

print(data1)
print(data2)

可能不完全是您想要的,但如果您将来有更复杂的要求,发布此内容可能会有所帮助:

>>> from itertools import groupby, count
>>> index = count()
>>> database = {key: [*group] for key, group in groupby(data, lambda x:types[next(index)])}
>>> database
{'vigi': ['xx', 'tr'],
 'fruits': ['kl', 'ut', 'ew'],
 'nothing': ['uy', 'lp', 'eq', 'aq']}
参考资料:


  • 可能只有我一个人,但这需要压缩和迭代两次,这让我非常恼火。可能使用“普通”循环,并根据需要附加到每个列表中
    data1, data2 = [], []
    out = (data2, data1)
    for t, d in zip(types, data):
        out[t == 'vigi'].append(d)
    
    print(data1)
    print(data2)
    
    >>> from itertools import groupby, count
    >>> index = count()
    >>> database = {key: [*group] for key, group in groupby(data, lambda x:types[next(index)])}
    >>> database
    {'vigi': ['xx', 'tr'],
     'fruits': ['kl', 'ut', 'ew'],
     'nothing': ['uy', 'lp', 'eq', 'aq']}