Liste içindeki değeri bulma

Selamlar

12 tane integer gelen sayıları liste içinde sayilar1 olarak topladım. Gelecek integer değerler 1 veya 0 olarak geliyor.

Diyelim ki 9. sıradan 1 geliyor ve 9 değerini index ile okuyorumve buraya kadar herşey tamam. Sonrasında 2. sıradan 1 geldiğinde sıra sayısı 2 ye dönüyor. 9 uncu değer 0 olduğunda 2 inci sıranın değerini nasıl görebilirim. Yani ilk gelen sıfırlanmadığı sürece benim için esas kalacaktır.

Acil desteklerinize ihtiyacım vardır.

sayilar1 = [s1[0], s1[1], s1[2], s1[3], s1[4], s1[5], s1[6], s1[7], s1[8], s1[9],s1[10], s1[11]]
sayi = sayilar1.index(1)
print(sayi)

Sorunu anlamaya çalıştım ama anlayamadım. Belki bendedir hata. Ne istediğini anlasam yardımcı olacaktım.

2 Beğeni

Demek istediğini ben anlayamadım tam olarak biraz daha açılayabilir misin

şöyle bir değer okuyorum. 12 li bir liste değeri [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
bunlardan dokuzuncu sıradaki değer 1 oluyor [0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0]
burada sonuç olarak index değerini 8 olarak okuyorum. buraya kadar herşey tamam

fakat [0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0] bu değer varken diyelim 2. sıradaki değer 1 oluyor [0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
okuduğum değer 1 oluyor.

Benim istediğim ise 9. sıradaki değer sıfır olana kadar veya 9. sıradaki değer bir iken, 2. sıradaki değer bir olsa bile yine de 8 değerini vermesi.

Bir de 9. sıradaki değer sıfır olduğunda ise 2. sıradaki değerki sıranın sonucunu vermesi.

umarım açıklayıcı olmuştur

Neyin sonucu olarak?

Okudugum deger ile verilen deger ayni sey mi?

Bir fonksiyondan mi bahsediyoruz?
O halde fonksiyonun state tutmasi lazim. Gelen listenin yaninda, bir de disarida tutulan (mesela global, mesela self uzerinde) degiskene ihtiyac var, ki hatirlayabilsin.

Neyin sonucu olarak?

liste değerinin index sonucu olarak demek istemiştim.

sayilar1 = [0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0]
sayi = sayilar1.index(1)
print(sayi)
8

Okudugum deger ile verilen deger ayni sey mi?

Bir fonksiyondan mi bahsediyoruz?
O halde fonksiyonun state tutmasi lazim. Gelen listenin yaninda, bir de disarida tutulan (mesela global, mesela self uzerinde) degiskene ihtiyac var, ki hatirlayabilsin.

doğrudur okunan değer ile verilen değer dediğim aynı şey aslında. telafuzda bir yanlışlık oldu.

Sorun degil, sadece emin olmak istedim.

Tamam, index’e hafiza eklemek istiyoruz. Eski donen deger hala duruyorsa onu dondurecegiz.

Yanlış anlamıyorsam bir elemanın bir liste içindeki sıra numarasını, o eleman liste içinde en son hangi sırada yer alıyorsa, o sıraya göre ifade etmek istiyorsunuz.

def rindex(x, i):
    return len(x) - x[::-1].index(i) - 1 if i in x else None


print(rindex([0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0], 1) == 9)
print(rindex([0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0], 1) == 8)
print(rindex([0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0], 1) == 8)
print(rindex([0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 1) == 1)
3 Beğeni

sadece 0 veya 1 geliyorsa true false şeklinde yaklaşılabilir binary yaklaşılabilir.

Hiç bir şey anlamadım.

Neden diyelim ki dokuzuncu sıra?

10’uncu sıra veya 12’nci sıra?

Hepsi 1 olursa hangisi önemli?

Hepsi 0 olursa hangisi önemli?

  1. Sırada 1 geldiğinde nasıl sıra sayısı 2 ye dönüyor?

Kim döndürüyor nasıl döndürüyor?

Döndürmemesi mi gerekiyor, döndürmesi mi gerekiyor?

9 uncu değer 0 olduğunda 2 inci sıranın değerini nasıl görebilirim ne demek?

9’uncu değer sıfırsa, neden 2 ye bakayım? Hangisi 1 se ona mı bakacağız? Peki birden fazla sırada 1 varsa ne yapacağız?

Yani ilk gelen sıfırlanmadığı sürece benim için esas kalacaktır ne demek?

İlk gelenin hangisinin olduğunu nerede belirledin, nasıl belirledin kim belirledi?

Bir soru nasıl sorulamaz deseler örnek olacak hale gelecek bir konu başlığı olmuş.

Sorunu anlamak için iki kişi pas geçmiş biride anlamak için çaba sarfediyor.

Basitçe ne amaçla kodladığını, ne yapmaya çalıştığını ne sonuç elde etmek istediğini anlatamıyor musun?

Ben burada 12 bitlik bir sayı görüyorum aslında.

Hangisi büyük hangisi küçük karşılaştırmasıyla kolayca sorun çözülebilir.

Bitler kaydırılır çözülür, modülü alınır çözülür , and lenir, or lanır türlü çözülür.

Ama sorduğun şekliyle çözülmez.

9 sıradaki değer sıfır mı diye kontrol et, 1 ise bu değeri kullan değilse 2. sıraya bak.

  1. Sıradaki değeri kontrol et sıfır ise 2. sıradaki değere bak.

Hiç açıklayıcı olmadı.

Neden kafayı 9 ve 2 ye taktık.

En sağdaki 1 i bul gibi basit bir problemden farkı ne?

Listede elemanı bul, en sağdaki, yani sondaki elemanın indexini al.

Bu yapmaya çalışıyorsan kolay bir yolu var.

my_list = ['0', '1', '0', '0', '1', '1', '0']


reversed_list = my_list[::-1]
last_index = reversed_list.index('1')

original_index = len(my_list) - last_index - 1

print("En sağdaki '1' elemanının index'i:", original_index)

Listeyi ters çevir ilk 1 değerini bul. Zaten nerede ilk 1 buluyorsa ona göre işlem yapar.

Sonra listeyi düz indeksler ve doğru indeks değerini alırsın.

Tabi bu bir milyon ihtimalden biri.

Ne yapmaya çalıştığını düzgün anlatsan bu kadar adamı meşgul etmezsin.

Mesela, hala 9 ve 2 özel mi en sağdaki değerin 1 mi olmasına göre işlem yapıyorsun anlatamamışsın.

2 Beğeni

Kısacası listenin sonunda olan 1 değerinin indexini mi istiyorsun?

Eğer doğru anladıysam tam olarak istediğin şey bu;

list = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
indexHafiza=int()
while(True):
print(list)

index = int(input("Degistirmek istediğiniz index numarasını giriniz: "))

if list[index] == 1:
list[index] = 0
else:
list[index] = 1

if 1 in list:
if list[indexHafiza] != 1:
indexHafiza = list.index(1)
else:
print(“Listede 1 bulunmamaktadır.”)

print("İndex hafiza = “,indexHafiza)
1 Beğeni

Merak ettim tamen benim beceriksizliğim. Kodu bu haliyle yapıştırıp doğrudan çalıştırabilien oldu mu? Scope ları düzeltmek gerekiyor sanki.

Kodunuzdan anladığım, while döngüsü ile bir index inputu alıyorsunuz ve verilen index e 1 değerini giriyorsunuz.

Sorunun cevabı bu ise kafamı taşlara vuracağım da.

Şöyle bir durum var.

Yani onca kişi burada şair burada ne demek istemiş diye anlamaya çalışıyoruz ama.

Tek istediği, listenin için verilen indexe 1 nasıl eklerim sorusu ise kahrımdan ölmeyi planlıyorum da.

Ve henüz, önerileri deneyip, şu oldu şu olmadı, bu böyle burası benim istediğim gibi değil de diyemedi.

Bizim için bir fenomen olarak kalsın istemem.

Ben nihayetinde anladım sanırım. Öneri çözümüm ise şu şekilde.
birler = []
diye ayrıca bir liste oluştur. Ve kendi listene gelen sayılardan 1 olursa onun index ini de
birler.append(1gelensayinin_indexi)
şeklinde kaydet.
Programının istediğin bir yerine de

if seninlisten[birler[0]]==0:
    birler.pop(0)

şeklinde bir kod koy.
Böylece sayı geldikçe listenin başındaki (örneğin 9. elemanın,) sıfır olup olmadığını kontrol edecek, eğer sıfırsa listeden kaldıracak dolayısı ile sıra bir sonraki elemana geçecek (senin örnekte 2)

1 Beğeni

Üzerinize alınmayın, gülmekten yazamıyorum artık.

Bakış açınız güzel bu da olabilir belki doğru yaklaşım bilmiyorum.

Adam cevapları beğenmeye bile gelmiş.

Ama biz hala ne demeye çalışıyor diye anlamaya çalışıyoruz.

İşte sorun o sondaki sanırım kelimeniz.

Hiç birimiz emin olamıyoruz.

Ve insafa gelip kendini ifade edebilmesini bekliyoruz.

Anlasak eminim buradaki herkes bir çözüm bulacak sorun büyük bir sorun değil ama bir türlü ne istendiğinden emin olabileceğimiz bir şey göremedik.

Yani kodu ne amaçla yazdığını ne yapmaya çalıştığını bir anlayabilsek sonucunda tabi ki bir çok çözüm önerilebilir.

Bizde mi bir algılama problemi var insanlar mı artık kendini ifade edemez hale gemiş ben önce bunu anlamaya çalışıyorum.

Bu metodolojiyle bu sorun nasıl çözülecek merakla bekliyorum.

1 Beğeni

Öncelikle yanlış anlatımım için kusura bakmayın lütfen.

Ben amatör bir yazılımcı bile olmadığımı belirtmek istiyorum.

Amacım ModbusTCP ile 12 adet biti okumaktı. Herhangi bir bit true olduğunda bitin sıra numarasını alabiliyorum. Sıra numarasını okurken, okunan bitin öncesinde ikinci bir bit true olarak geldiğinde ise ikinci bitin numarasına geçiyor. Burada ikinci True nereden gelirse gelsin birinci True olarak okuduğum değerin değişmemesiydi. Dolayısı ile burada kod kısmında tıkanmıştım.

Kıymetli vaktinizi harcadıysam affola.

Kodu aşağıda paylaşıyorum.

Saygılarımla…

from pyModbusTCP.client import ModbusClient
from time import sleep
try:
    host = "192.168.1.1"
    port = 502
    connection = ModbusClient(host, port)
except:
    connection = None
    pass
def data():
    global connection
    while True:
        dataread = connection.read_discrete_inputs(1, 12)
        bit = dataread.index(1)
        print(bit)
        sleep(1)
if __name__ == '__main__':
   data()

Amatör olmanız, bilmemeniz, yapamamanız hiç problem değil. Kimse size neden bilmiyorsunuz neden yapamıyorsunuz demiyor.

Tabi ki yapamamış olmalısınız ki soruyorsunuz. Soracaksınız, sorun.

Sormanız problem değil ne istediğinizi anlamaya çalışıyoruz hepsi bu.

Bu durumda, datayı her okuduğunuzda sabit bir ikinci liste de ayrıca tutup, o listeye gelen biti eklemeniz kolayca sorununuzu çözerdi.

Aslında şöyle sorsanız kendiniz de çözerdiniz;

TCP ile 12 adet bit değeri alıyorum, her seferinde bir veya bir kaç biti değişen bir data geliyor. Ben true/ 1 olan değerler kalacak şekilde artımlı olarak değerler almak istiyorum nasıl yapabilirim.

Yada 12 bit veriden 1/true değeri olan değerleri kalmak şartıyal verileri almak istiyorum nasıl yapabilirim.

Bu durumda, okuma yaptığınız veri listesi dışında birleri tutmak için size ikinci bir liste gerekir. Böylece bir sonraki 12 bit data geldiğinde listenizdeki 1’ler/ True lar tekrar sıfıra dönmemiş olur diyebilirdik.

Ki bu da oldukça kolay kodlanabilecek bir konu ve size burada sayısız örnek verilirdi.

EDIT:

Bir örnek verelim. Aslında bir 12 bit bir data okuyoruz. Sonra bir önceki okuduğumuz listedede 0 olanlardan 1 e dönecek bir değer varsa onu 1 e dönüştürüyoruz.

Bir çok yok var.

12 bit porttan okuduğumuz dataya, read diyelim.

Sonra bunları tutacağımız sabit bir listemiz olsun buna da status diyelim.

Yapmamız gerken bu iki tabloyu karşılaştırıp ki bunu any yordamıyla yaparsak, bir nevi or operatörü ile listeyi karşlılaştırmış oluruz bu da herhangibi biri 1 değerinde ise listeyi true ya dönüştürür ve biz bunu int formatlarsak sayı olarak status listemiz güncellenmiş olur.

import numpy as np

read  =np.array([1,1,0,1,1,0,0,0,1,0])
status=np.array([0,1,0,1,0,1,1,0,1,0])

status = np.any([read, status], axis=0)

print (status.astype(int))

Sonuçta:
image

Tabi bir for döngüsüyle yada zip ile her bir elemanı tek tek karşılaştırarak da çözebilirsiniz.

Artık status listesi sizin True, yani 1 olan değerlerinizi tutarken, read ile porttan okuduklarınızı istediğiniz yerde tekrar güncelleyebilirsiniz.

Güncellemek için tek yapmanız gereken:

Her ihtiyaç duyduğunuzda yada her okuduğunuzda;

status = np.any([read, status], axis=0)

ile durum listenizi güncellemek.

1 Beğeni

Destekleriniz için çok teşekkürler.

Emeğinize sağlık.

1 Beğeni

Ben bu problemi düşündükçe sevmeye başladım. Benim yöntemle de olmuyor. Biraz daha düşüneyim üstüne.

Elimizdeki belirsiz durumlar şunlar. Her tur sadece bir tane 1 gelecek diye bir durum yok, birden fazla gelebilir.
bit = dataread.index(1)
işe yaramaz çünkü her zaman listenin başındaki değeri döndürmeye eğilimli. Bu problemin de çözülmesi gerekiyor.
Benim dediğim gibi yeni liste ve değeri 1 olanları kaydetme de sorunlar var. Peşpeşe iki defa 9, sonra 2 bir olursa ve 9 daki değer 0 landığında hala listemde fazladan bir tane 9 kalacaktır.

1 Beğeni