在文件/列表中打印相同值的索引

时间:2015-10-14 18:07:25

标签: python python-3.x

我有一个包含数据的文本文件。例如,我想打印出" animal"的所有值。所以当"动物"选择,它将打印出来"猴子","大象"和#34;狗"。它有点工作,但它只打印出第一个值。例如,如果我选择" animal",它只打印出Monkey。

有没有办法让它打印出来?也许有更好的方法来做到这一点?

Data2.txt:

Adidas, shoe
Monkey, animal
Soup, food
Elephant, animal
Dog, animal 
Taco, food
file = open('data2.txt')
data = file.readlines

stuffs = []
types = []


for line in data():
 line = line.strip()
 stuff, type = line.split(', ')
 stuffs.append(stuff)
 types.append(type)

animals = types.index('animal')
print (stuffs[animals])

6 个答案:

答案 0 :(得分:1)

你需要循环遍历类型,因为types.index('animal')只会返回第一个类型。找到索引后,您可以在stuffs中找到相应的索引。试试这个:

text-area

答案 1 :(得分:1)

我认为更好的想法是使用dict:

file = open('data2.txt')
data = file.readlines

categories = {}

for line in data():
 line = line.strip()
 stuff, type = line.split(', ')
 categories.setdefault(type, []).append(stuff)

print (categories['animal'])

答案 2 :(得分:1)

使用collections.defaultdict对类型进行分组,使用csv module来解析文件:

import csv
from collections import defaultdict
with open("test.txt") as f:
    # create rows splitting on commas 
    r = csv.reader(f, skipinitialspace=True)
    # create dict to store all the types
    d = defaultdict(list)
    # v = row[0], k = row[1]
    for v,k in r:
        d[k].append(v)

输出:

defaultdict(<class 'list'>, {'shoe': ['Adidas'], 
                           'food': ['Soup', 'Taco'], 
                           'animal': ['Monkey', 'Elephant', 'Dog']})

然后只需按键查找:

print(d["animal"])
print(d["shoe"])

['Monkey', 'Elephant']
['Adidas']

除非你真的想要一个列表,否则你不需要调用readlines,你可以迭代文件对象或者只是将它传递给csv模块并迭代读取器对象,如上面的代码所示。

答案 3 :(得分:1)

您填充列表的方式,您有一个动物列表,一个具有相应类型的列表,位于相同位置。使用index,您只能获得第一场比赛,但您需要全部比赛。

一种方法是使用zip迭代成对的动物和类型,并打印每种类型正确的动物。

for s, t in zip(stuffs, types):
    if t == "animal":
         print(s)

或者您可以使用列表理解来收集列表中的所有动物:

>>> [s for s, t in zip(stuffs, types) if t == "animal"]
['Monkey', 'Elephant', 'Dog']

或者,更改存储数据的方式。例如,您可以创建一个开头的对列表,而不是让两个列表具有相应的索引并将这些列表压缩回一对列表:

pairs = []
for line in data():
    line = line.strip()
    pairs.append(line.split(', '))

print([s for s, t in pairs if t == "animal"])

甚至可以使用字典,将类型映射到填充内容,如其他一些答案所示。

答案 4 :(得分:1)

d = {}
with open('data','r' ) as f:
    for line in f:
       le, r = line.split(',')
       d.setdefault(r.strip(),[]).append(le.strip())

for k,v in d.items():
    print(k,v)

shoe ['Adidas']
food ['Soup', 'Taco']
animal ['Monkey', 'Elephant', 'Dog']

答案 5 :(得分:0)

以这种方式使用numpy:

import numpy as np

a = np.loadtxt("myFile")

#Then it's simple!

a[a[:,1] == 'animal'][0]