2015-10-14 83 views
2

我有一个带有数据的文本文件。例如,我想打印出“动物”的所有值。所以当选择“动物”时,会打印出“猴子”,“大象”和“狗”。它有点作用,但它只打印出第一个值。例如,如果我选择“动物”,它只打印猴子。在文件/列表中打印出相同值的索引

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

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]) 
+0

什么是与您当前密码的问题?它做了什么,以及它与你想要做的有什么不同? – jonrsharpe

回答

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"]) 

甚至使用字典,地图类型的东西,正如其他一些答案中的建议。

+0

谢谢!第一个很容易理解! – saltcracker

1

你需要通过类型的循环,因为types.index( '动物')将只返回你的第一个。一旦你找到索引,你可以找到相应的索引。试试这个:

i = 0 
for type in types: 
    if (type == 'animal'): 
    print (stuffs[i]) 
    i = i + 1 
+0

如何为我输入enumerate(types):? –

+0

我敢肯定,这也很有效,但我很明确 – ergonaut

+1

@ergonaut,你更重新发明轮子 –

1

我想一个更好的主意是使用一个字典:

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']) 
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模块和迭代读者对象在上面的代码中。

+0

出于某种原因,'动物'出现两次在你的字典。可能是数据文件中的一个杂散空间......猜猜'csv.reader'没有'去掉' –

+0

@tobias_k,你说得对,这很奇怪,因为'skipinitialspace = True'应该已经删除了前导空间。我将不得不做一些调查 –

+0

但这是一个尾随空间,而不是领先的空间。 ;-) –

0

使用numpy的是这样的:

import numpy as np 

a = np.loadtxt("myFile") 

#Then it's simple! 

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

请解释downvote – farhawa

+1

这不是我,但你假设他们知道numpy是什么,以及那个神秘的线正在做什么。 – ergonaut

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'] 
相关问题