Listelere sıra numarası vermek

Liste=[]

Liste1=[[a,b,c],[d,e,f]]
Liste2=[[h,i,j],[k,l,m],[n,m,o]]


liste1 ve liste 2 yi sıra numarası vererek listeye append etmek istiyorum.

Liste=[[1,a,b,c],[2,d,e,f],[1,h,i,j],[2,k,l,m],[3,n,m,o]]

Sizce nasıl yapılabilir bu? Nasıl bir algoritma oluştururdunuz? Bildikleriniz kadarıyla aklınıza gelenleri paylaşın, birlikte bakalım.

Aşağıdaki kod ile bir site üzerinden veri çekiyorum.

from selenium.webdriver.common.action_chains import ActionChains
from time import sleep
import pandas as pd
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()))
driver.get("https://www.hipodromx.com/galop.aspx?Page=1")
sleep(2)
TABLO=[]
for i in range(4, 2, -1):
    tab=driver.find_element(By.XPATH,
            "//img[@id='ctl00_ContentPlaceHolder1_ASPxPageControl1_cbGalopIstatistikMesafe_B-1Img']")
    ActionChains(driver).move_to_element(tab).click().perform()
    sleep(2)
    sub_tab=driver.find_element(By.XPATH,
            "//td[@id='ctl00_ContentPlaceHolder1_ASPxPageControl1_cbGalopIstatistikMesafe_DDD_L_LBI{}T0']".format(i))
    ActionChains(driver).move_to_element(sub_tab).click().perform() #Range aralığına göre 1400-1200-1000-800-600-400 e tıklıyor.
    sleep(2)
    tablo = driver.find_elements(By.XPATH,
            "//tr[contains(@id,'ctl00_ContentPlaceHolder1_ASPxPageControl1_grdGalopIstatistik_DXDataRow')]//descendant::td")#mesafeye göre açılan tablodaki bilgileri çekiyor
    for i in tablo:
        TABLO.append(i.text)


tablo_duzenleme=[TABLO[x:x+10] for x in range(0, len(TABLO), 10)]
print(tablo_duzenleme)
df=pd.DataFrame(tablo_duzenleme, columns=["Tarih","Atadı","Şehir","1200+","1000","800","600","400","G.K","İdman_Jokeyi"])
print(df)

Kod çıktısı:

0  26/02        KATHERİNA    AT                   39,4  26,4   R      O.Öztürk
1  26/02         TETRAGON    AT                   39,8  26,2   R  A.Demirkıran
2  26/02        HAKK HANI    AT               50        24,6   R   Mur.Aydoğdi
3  26/02          ICE TEA    AT             51,4        25,2   R      R.Keskin
4  26/02  SHOW MUST GO ON    AT             51,6        26,5   R      O.Öztürk
5  26/02    STONE ACTIONS    AT             52,1          26   R    Ç.Canpolat

çıktının aşağıdaki gibi olmasını istiyorum:

0  1-26/02        KATHERİNA    AT                   39,4  26,4   R      O.Öztürk
1  2-26/02         TETRAGON    AT                   39,8  26,2   R  A.Demirkıran
2  1-26/02        HAKK HANI    AT               50        24,6   R   Mur.Aydoğdi
3  2-26/02          ICE TEA    AT             51,4        25,2   R      R.Keskin
4  3-26/02  SHOW MUST GO ON    AT             51,6        26,5   R      O.Öztürk
5  4-26/02    STONE ACTIONS    AT             52,1          26   R    Ç.Canpolat

for i in range(4, 2, -1): döngüsünün 1. adımında TABLO'ya eklenen değerleri bir görelim:

    for i in tablo:
        TABLO.append(i.text)
    print(TABLO)

TABLO`'nun içine baktığımızda şöyle değerlerle karşılaşıyoruz:

['26/02', 'GANANDO SOLO', 'İS', ' ', ' ', ' ', '37', '24,3', 'R', 'A.Tekdemir', '26/02', 'BRONZE HILL', 'İZ', ' ', ' ', ' ', '39', '26', 'R', 'A.C.İnan', '26/02', 'KATHERİNA', 'AT', ' ', ' ', ' ', '39,4', '26,4', 'R', 'O.Öztürk', '26/02', 'DONNA', 'İZ', ' ', ' ', ' ', '39,4', '26,6', 'R', 'H.Tunç', '26/02', 'SIRDERYA', 'İS', ' ', ' ', ' ', '39,5', '26,5', 'R', 'M.A.Aktürk', '26/02', 'TETRAGON', 'AT', ' ', ' ', ' ', '39,8', '26,2', 'R', 'A.Demirkıran', '26/02', 'BRIGHT', 'İS', ' ', ' ', ' ', '40,6', '27', 'R', 'R.Arslan', '26/02', 'NORTHSHIELD', 'İS', ' ', ' ', ' ', '41', '26,2', 'R', 'B.Aktaş', '26/02', 'PLEINE LUNE', 'İS', ' ', ' ', ' ', '42,8', '28,8', 'R', 'Ö.Gönültaş']

Şimdi, sizin yazdığınız kodlara göre bu listenin ilk elemanı '26/02' gibi tarih verisini simgeleyen bir string ve listenin içinde bir çok kez tekrar etmiş. Kaç kez tekrar ettiğini bulmaya çalışacağız.

O halde,

    for i in tablo:
        TABLO.append(i.text)
    print(TABLO)

ifadesini biraz değiştirmemiz gerekiyor:

for i in range(4, 2, -1):
    # Selenium işlemleri...
    [...]
    # Dıştaki döngünün her bir adımında say'ın değeri sıfırlanacak ve
    # sayma işlemi yeniden başlatılacak.
    say = 0
    # Her bir tablo bir sayfadan çekilen değişik sayıdaki satır verilerini içeriyor.
    # Dolayısıyla tablo içindeki satır sayısı belli.
    # Bizim sadece tarihlerin başına satır sıra numaralarını eklememiz lazım.
    for i in tablo:
        # Eğer TABLO yoksa veya TABLO var ve i.text TABLO[0]'ın içindeyse: 
        if not TABLO or (TABLO and i.text in TABLO[0]):
            say += 1
            text = f"{say}-{i.text}"
        else:
            text = i.text
        TABLO.append(text)

Çıktı:

       Tarih            Atadı Şehir 1200+  ...   600   400 G.K  İdman_Jokeyi
0    1-26/02     GANANDO SOLO    İS        ...    37  24,3   R    A.Tekdemir
1    2-26/02      BRONZE HILL    İZ        ...    39  3-26   R      A.C.İnan
2    4-26/02        KATHERİNA    AT        ...  39,4  26,4   R      O.Öztürk
3    5-26/02            DONNA    İZ        ...  39,4  26,6   R        H.Tunç
4    6-26/02         SIRDERYA    İS        ...  39,5  26,5   R    M.A.Aktürk
5    7-26/02         TETRAGON    AT        ...  39,8  26,2   R  A.Demirkıran
6    8-26/02           BRIGHT    İS        ...  40,6    27   R      R.Arslan
7    9-26/02      NORTHSHIELD    İS        ...    41  26,2   R       B.Aktaş
8   10-26/02      PLEINE LUNE    İS        ...  42,8  28,8   R    Ö.Gönültaş
9    1-26/02        HAKK HANI    AT        ...        24,6   R   Mur.Aydoğdi
10   2-26/02          ICE TEA    AT        ...        25,2   R      R.Keskin
11   3-26/02  SHOW MUST GO ON    AT        ...        26,5   R      O.Öztürk
12   4-26/02   FLAWLESS POWER    İS        ...        26,5   R      Ş.Dursun
13   5-26/02    STONE ACTIONS    AT        ...        6-26   R    Ç.Canpolat
14   7-26/02   FOREVER JUSTEN    İZ        ...        26,6   R      A.C.İnan
15   8-26/02    OĞUZUN RÜYASI    AD        ...        26,8  ÇR     A.E.Tülek
16   9-26/02      BABA RUNNER    İZ        ...        27,5   R    R.Canpolat
2 Beğeni

Açıklamanız çok güzel ve anlaşılır teşekkür ederim. Ancak bazı sıra numaralarını atlıyor.Aslında derecede 26 sayısını gördüğünde onlara da sıra numarası koyuyor Birde
f"{say}-{i.text}" kullanımını ilk defa görüyorum. Bu ne anlama geliyor. daha doğrusu başındaki f.

Evet, kaçırıyor çünkü sorgumuz biraz ilkel. Sorguyu biraz daha detaylandırmak gerekiyor.

Mesela re kütüphanesini böyle bir örnekte kullanabilirsiniz.

Düzenli ifadeler hakkında daha fazla bilgi için aşağıdaki bağlantıyı inceleyin:

22/22 ifadesi rakam + rakam + "/" + rakam + rakam gibi bir örüntüye sahip.

Şöyle bir fonksiyon tanımlıyorum:

def has_pattern(string, pattern):
    return re.compile(pattern).match(string)

Sorguyu da şu şekilde değiştiriyorum:

    say = 0
    for i in tablo:
        if has_pattern(i.text, r"^\d{2}/\d{2}$"):
            say += 1
            text = f"{say}-{i.text}"
        else:
            text = i.text
        TABLO.append(text)

Buna göre aldığım çıktı şöyle oluyor:

       Tarih               Atadı Şehir 1200+  ...   600   400 G.K   İdman_Jokeyi
0    1-26/02        GANANDO SOLO    İS        ...    37  24,3   R     A.Tekdemir
1    2-26/02            DEE MARK    AD        ...  38,8  25,7   R     M.G.Arslan
2    3-26/02           MUSHARRAF    AD        ...  38,8  25,7   R  Serkan Yıldız
3    4-26/02         BRONZE HILL    İZ        ...    39    26   R       A.C.İnan
4    5-26/02           KATHERİNA    AT        ...  39,4  26,4   R       O.Öztürk
5    6-26/02               DONNA    İZ        ...  39,4  26,6   R         H.Tunç
6    7-26/02            SIRDERYA    İS        ...  39,5  26,5   R     M.A.Aktürk
7    8-26/02  ANGEL OF THE SOUTH    AD        ...  39,6  26,2   R       R.Bayram
8    9-26/02         HEART BRIDE    AD        ...  39,6  26,2   R      E.Çankaya
9   10-26/02            TETRAGON    AT        ...  39,8  26,2   R   A.Demirkıran
10  11-26/02              BRIGHT    İS        ...  40,6    27   R       R.Arslan
11  12-26/02         NORTHSHIELD    İS        ...    41  26,2   R        B.Aktaş
12  13-26/02         PLEINE LUNE    İS        ...  42,8  28,8   R     Ö.Gönültaş
13   1-26/02           HAKK HANI    AT        ...        24,6   R    Mur.Aydoğdi
14   2-26/02             ICE TEA    AT        ...        25,2   R       R.Keskin
15   3-26/02     SHOW MUST GO ON    AT        ...        26,5   R       O.Öztürk
16   4-26/02      FLAWLESS POWER    İS        ...        26,5   R       Ş.Dursun
17   5-26/02       STONE ACTIONS    AT        ...          26   R     Ç.Canpolat
18   6-26/02             AKUANDA    AD        ...        26,5   R        K.Yiğit
19   7-26/02      FOREVER JUSTEN    İZ        ...        26,6   R       A.C.İnan
20   8-26/02       OĞUZUN RÜYASI    AD        ...        26,8  ÇR      A.E.Tülek
21   9-26/02         BABA RUNNER    İZ        ...        27,5   R     R.Canpolat

Stringin başındaki f, fstring demek, stringi biçimlendirmeye yarıyor. Değişik string biçimlendirme yöntemleri var:

a = "merhaba"
b = "dünya"
print(a + b)
print(f"{a}{b}")
print("{}{}".format(a, b))
print("%s%s" % (a, b))

Bu biçimlendirme yöntemleri aynı çıktıları üretiyorlar.

1 Beğeni

herhangi bir tablo boş olduğunda da çalışacaktır değil mi.

Bu yeni sorguda i.text'in TABLO[0]'ın içinde olup olmadığına bakmıyoruz. i.text'in 26/23 gibi bir örüntüsü var mı ona bakıyoruz. 50/98 ifadesi mesela bu örüntüye uyar. Ama bu örüntüye uyan tarih dışında başka bir hücre değeri olmadığı için has_pattern fonksiyonu sadece i.text 26/23 olduğunda True değerini verecektir. Kaçıncı kez True değerini aldığımız da say ile belirlenecek. say değişkeni de kaç tane tablo varsa o kadar kez sıfırlanır ve saymaya baştan başlanır.

1 Beğeni