Найти - Пользователи
Полная версия: Проверка типа элемента списка
Начало » Python для новичков » Проверка типа элемента списка
1 2 3
int123
Здравствуйте!
Возникла следующая проблема. У меня есть список, элементом которого могут являться как списки, так и целые числа. В цикле мне нужно проверять, является ли i-ый элемент списка списком или числом. Если списком, то действия совершаются, если числом, то нужно просто перейти на следующий элемент. С помощью type я могу вывести тип элемента, но не могу в программе проанализировать его.

mas=[[1,3,9],[2,8,4,7],5]
for i in range(len(mas)):
if type(mas[i]).find('int')==-1:
i=i+1
На это вполне предсказуемо выходит ошибка AttributeError: type object ‘list’ has no attribute ‘find’. Гугл, к сожалению, тоже не помог.Как в программе установить, какого типа элемент списка?
Подскажите, пожалуйста!



НОВЫЙ ВОПРОС СООБЩЕНИЕМ НИЖЕ!
int123
Спасибо! Заработало.
int123
Решила не создавать новую тему, а снова написать здесь.
Помогите пожалуйста найти ошибку в алгоритме минимизации конечного автомата (мы “склеиваем” вершины по группам похожести)! Может, она совсем очевидная, а я не вижу.
Проблемы две:
1) Почему-то игнорируется первый continue
2) Алгоритм зацикливается, хотя по логике если мы в какой-то момент не разделим класс, то t не получит значения 1.

mas=[((1,'a',1),(1,'b',2)),((2,'a',1),(2,'b',4)),((3,'a',1),(3,'b',5)),((4,'a',3),(4,'b',4)),((5,'a',2),(5,'b',5)),((6,'a',2),(6,'b',4))]
t=1
clas=[[2,3,4,6],[1,5]]

i=0
while t==1:
t=0
qw=[]
for i in range(len(clas)):
if isinstance(clas[i],int):
continue
qw=clas[i]#konkretnyi klass
statver=[['',''],['',''],['',''],['',''],['',''],['',''],['','']]
for j in range(len(qw)):
er=qw[j]#j-poryadok ver6iny v klasse, er-zna4enie.
mq=mas[er-1]#ver6ina v massive
#print(mq)
for k in range(len(mq)):
sa=mq[k]#konkretnoe rebro
#print(sa)
for s in range(len(clas)):
clasn=clas[s]
#print(clasn)
if sa[2] in clasn:
if sa[1]=='a':
u1=sa[0]
statver[u1][0]=sa[1]+str(s)
#statver[0][u1]=sa[1]+str(s)#spisok kakoe rebro v kakoi klass vedet
else:
statver[u1][1]=sa[1]+str(s)
#statver[1][u1]=sa[1]+str(s)#spisok kakoe rebro v kakoi klass vedet

break
#print(statver)

newclas=[0,0,0,0,0,0,0,0,0,0,0,0,0,0]
checkn=[]
print(statver)
for i1 in range(len(clas[i])):
ver=clas[i][i1]#сама вершина
for i2 in range(len(clas[i])):
ver1=clas[i][i2]
if isinstance(checkn,list) and i2 in checkn:
print('za6el')
continue
if statver[ver]!=statver[ver1]:
newclas[ver]=ver1;
checkn.append(ver1)
else:
print('ni4ego ne pomenyali')
t=1
checkn.append(ver)
if t==1:
print('i suda')
divclas=clas
for i3 in range(7):
if newclas[i3]==0:
del(newclas[i3])
del divclas[i]
divclas=divclas+[newclas]
clas=divclas
print(t)
s0rg
Опишите задачу, так как код нечитабелен )
Пока единственное что мне показалось странным:
if sa[1]=='a':
u1=sa[0] # <- вот тут u1 определен
statver[u1][0]=sa[1]+str(s)
else:
statver[u1][1]=sa[1]+str(s) # <- а вот тут нет
int123
http://www.cs.uky.edu/~lewis/essays/compilers/min-fa.html - Вот тут есть объяснение алгоритма, но оно, к сожалению, на английском.

Задан граф в формате вершина-переход-вершина. Из каждой вершины выходят ровно 2 стрелочки под буквами a и b. Сначала группируем в одну кучу начальное и конечное состояние. Во вторую - все остальное.
Затем проверяем, в какой класс выходят стрелочки из первой вершины. Допустим, a0 и b1. Затем проверяем вторую вершину первой группы. Получаем либо ту же комбинацию, либо другую. Если ту же, оставляем группу склененной. Если другая - разделяем. Аналогично со второй группой. Цикл повторяется до тех пор, пока мы больше не можем разделить группы.
Т.е. в конечном виде мы получаем набор вида, к примеру, [1,2,3,], где из 4 и 5 идут одинаковые стрелочки и эти вершины можно объединить в одну.

Спасибо за замечание, на свежую голову посмотрю!
s0rg
То. что на английском - даже лучше )

еще пара замечаний:
1. Вы определили переменную i в самом начале вне основного цикла - затем вы ее используете:
for i1 in range(len(clas[i]))
При этом она нигде у вас не меняется, это так надо?

2. По ссылке английским по-синему написано что условие остановки алгоритма - ‘no partitioning takes place’ то бишь если не было перестановок
У вас:
print('ni4ego ne pomenyali')
t=1 # <- принудительно продолжаем цикл
int123
При этом она нигде у вас не меняется, это так надо?
А разве она в цикле не должна меняться?

Я модифицировала программу по вашим замечаниям, добавила процедуру удаления лишних нулей и изменила создание нового класса. В итоге часть раздробилась, а часть нет. Причем куда-то еще потерялась последняя вершина 6 (вместо нее оказалась 3). И да, второй класс не дробится, видимо вы правы относительно i. Но по идее ж она меняется? О_о Или где ее менять тогда?

mas=[((1,'a',1),(1,'b',2)),((2,'a',1),(2,'b',4)),((3,'a',1),(3,'b',5)),((4,'a',3),(4,'b',4)),((5,'a',2),(5,'b',5)),((6,'a',2),(6,'b',4))]
t=1
clas=[[2,3,4,6],[1,5]]
def del1(spi,sw):
spi1=[]
for i6 in range(len(spi)):
if spi[i6]!=sw:
spi1.append(spi[i6])
return spi1


i=0
while t==1:
t=0
qw=[]
for i in range(len(clas)):
if isinstance(clas[i],int):
continue
qw=clas[i]#konkretnyi klass
statver=[['',''],['',''],['',''],['',''],['',''],['',''],['','']]
for j in range(len(qw)):
er=qw[j]#j-poryadok ver6iny v klasse, er-zna4enie.
mq=mas[er-1]#ver6ina v massive
#print(mq)
for k in range(len(mq)):
sa=mq[k]#konkretnoe rebro
#print(sa)
for s in range(len(clas)):
clasn=clas[s]
print(clasn)
if sa[2] in clasn:
if sa[1]=='a':
u1=sa[0]
statver[u1][0]=sa[1]+str(s)
#statver[0][u1]=sa[1]+str(s)#spisok kakoe rebro v kakoi klass vedet
else:
u1=sa[0]
statver[u1][1]=sa[1]+str(s)
print(u1)
#statver[1][u1]=sa[1]+str(s)#spisok kakoe rebro v kakoi klass vedet

break
#print(statver)

newclas=[0,0,0,0,0,0,0,0,0,0,0,0,0,0]
checkn=[]
print(statver)
for i1 in range(len(clas[i])):
ver=clas[i][i1]#сама вершина
for i2 in range(len(clas[i])):
ver1=clas[i][i2]
if isinstance(checkn,list) and i2 in checkn:
continue
if statver[ver]!=statver[ver1]:
newclas[ver]=[ver1];
checkn.append(ver1)
t=1
else:
#print('ni4ego ne pomenyali')
t=0
checkn.append(ver)
if t==1:
divclas=clas
newclas=del1(newclas,0)
del divclas[i]
divclas=divclas+newclas
clas=divclas
s0rg
'сама по себе' она не поменяется - вам нужно самостоятельно ее изменить.
Cкорее всего здесь:
checkn.append(ver)
i+=1
int123
Если я меняю i, как вы сейчас предложили, то на первом же шаге появляется ошибка выхода за пределы списка вот тут:
for i2 in range(len(clas[i])):
ver1=clas[i][i2]
Я когда отлаживала, то выводила i в том числе. Она изменялась(она выводит 0, 1, 1 как значения. Непонятно почему на второй итерации нет значения 0).

Вот еще появилась мысль, что после того, как разбивается первый класс, мы ж по идее дальше должны сравнивать со старой разбивкой, а не новой. А программа этого, кажется, не учитывает.
Спасибо, что помогаете : )
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB