2016-08-25 4 views
-1

Предположим, файл выглядит следующим образом:Альтернативный способ использования для цикла

abcd 1 
abcd 2 
abcd 3 
xyz 1 
xyz 2 

Мой код:

if "abcd" in line: 
    do something 

elif "xyz" in line: 
    do something 

Если оба «ABCD» и «хуг» динамически меняется, как бы я захватить их написав тот же цикл?

Edit:

Могу ли я написать универсальный цикл, который подсчитывает количество элементов в ABCD и АБВ? не принимая abcd и xyz в его состоянии.

+0

Что вы подразумеваете под «динамическим изменением»? Пожалуйста, дайте пример –

+0

«оба« abcd »и« xyz »динамически меняются», вы имеете в виду «abcd», а «xyz» могут быть произвольными строками *, но фиксируется при запуске *? – YiFei

+0

Что именно означает «динамически меняться»? –

ответ

0

Не уверен, что я понял, правильно ваш вопрос, но вот возможный способ собрать ключ & значений из вашего файла:

import re 
from collections import defaultdict 

file = """ 


abcd  1 
abcd  2 
abcd  3 
xyz  1 
xyz  2 




""" 

output = defaultdict(list) 

for line in file.split("\n"): 
    if line.strip() == "": 
     continue 

    key, value = re.search(r'(.*?)\s+(.*)', line).groups() 
    output[key].append(value) 

print(output) 

for k, v in output.iteritems(): 
    print("{0} has {1} items".format(k, len(v))) 
+0

Как подсчитать количество элементов, содержащихся в каждом ключе? Кроме того, что, если файл является внешним файлом, а не внутренним? – identical123456

+0

@ identity123456 Я редактировал свой вопрос, подсчитывая количество элементов на ключ. Версия для python 2.x, если вы используете 3.x, замените iteritems() на items() – BPL

+0

Что делать, если формат находится в форме abcd a1, abcd a2, abcd b1 и т. Д. И мне нужно было посчитать число a's типа abcd и число b типа abcd и аналогично для любых других строк – identical123456

0

Вы всегда можете использовать переменные для согласования, используя свой пример:

pattern1 = "abcd" 
pattern2 = "xyz" 
for line in lines_list: 
    if pattern1 in line: 
     do_smth 
    elif pattern2 in line: 
     do_smth2 
    pattern1 = get_new_pattern1() 
    pattern2 = get_new_pattern2() 

Также вы можете разделить линии слов с

first, second = line.split(' ') 

использовать это в цикле, чтобы получить доступ к первому и второму слову в строке соответственно.

0

Я не знаю, поймаю ли я ваше намерение, но я надеюсь, что следующий код вам поможет. keywords имитирует переменную динамически меняющейся переменной.

keywords = ['abcd', 'xyz', '123'] 
data = ['abcd', 
     'xyz', 
     'asdf', 
     'asdf', 
     '456', 
     'abcd', 
     'xyz', 
     'abcd', 
     'xyz', 
     'abcd', 
     'xyz', 
     'abcd', 
     'xyz', 
     '123', 
     '123'] 


counts = [ data.count(kw) for kw in keywords] 
print(counts) # [5, 5, 2] 
0

Ваш вопрос (и сделать предположение), то кажется, что вы хотите, чтобы пройти через каждую строку в файл и чем проверить, если текст на этой линии соответствует что-то еще. Скажем, у вас есть файл file.txt, который:

abcd 1 
abcd 2 
abcd 3 
xyz 1 
xyz 2 

Чтобы прочитать этот файл, вы должны сделать следующее:

filedata = open('file.txt', 'r') # Where r means read 
first_match = 'abcd' 
second_match = 'xyz' 
for line in text: 
    if first_match in line: 
     # Do stuff here 
    elif second_line in line: 
     # Do other stuff here 
    first_match = change_first_match() 
    second_match = change_second_match() 

Более подробная информация на чтение файлов here

0

Возможно, вам это нужно (какой-то счетчик динамического ключевого слова):

with open("filename.txt") as f: 
    d=dict() 
    for line in f: 
     line=line.rstrip("\n") 
     s=line.split(" ") # works iff you have only space as delimeter 
     if s[0] in d: 
      d[s[0]]+=int(s[1]) # replace by 1 if needed 
     else: 
      d[s[0]]=int(s[1]) # replace by 1 
    #print(d) 
Смежные вопросы