Programming Memoirs

Python’s built-in container data types: categorisation and iteration

The aim of this short article is to take a look on the built-in container data types in Python 3.1. This introduction, however, is not a typical one. Typical Python data types tutorials focus on describing individual data types one by one. Here, instead, I try to describe the ways Python container data types can be grouped according to their properties. I also explain when and why some containers are iterable, why others are not. Therefore, the article explains such concepts as:

  • mutable and immutable objects,
  • hashable objects,
  • ordered and unordered objects,
  • the relationship between sequence/set/mapping types with the iterable type, and demystifies the implicit sequence iterator in custom sequence containers.

The article assumes the reader has a fundamental understanding of container types in Python.

Brief recap

So… what are container data types in Python? In short — they are types whose instances are capable of storing other objects. As a quick reminder — some of the fundamental built-in container objects include:

  • lists – the most popular container data type in python; can store any number of any objects.
  • tuples – similar to list, yet once created are immutable,
  • sets – can store only unique elements,
  • bytes – immutable sequence of integers in the range 0 <= x < 256,
  • bytearray – like bytes, but mutable,
  • dictionary – also known as associative arrays. They contain mapping of keys into value,
  • collections.OrderedDict - ordered dictionary, present in the collections module. Like typical dictionary yet it remembers the order in which items have been added,
  • str – string, a sequence of unicode characters,
  • range – a sequence of numbers — more precisely a list containing arithmetic progressions
  • array.array – present in the array module. Similar to list, yet during the construction it is restricted to holding a specific data type,

More information on those can be found in http://docs.python.org/tutorial/datastructures.html

Python built-in container types cheat-sheet

I will just leave it here as it may come in handy for later.

Data type Mutable Ordered Literal example Constructor
Sequence types
list yes yes [1,2,3] list()
tuple no yes (1,2,3) tuple()
str no yes “text”  /  ‘text’ str()
range no yes range()
bytes no yes b’abcde’  /  b”abc” bytes()
bytearray yes yes bytearray()
array * yes yes array.array()
Set types
set yes no {1,2,3} set()
frozenset no no frozenset()
Mapping types
dict yes no {“key1″: “val”, “key2″: “val”} dict()
OrderedDict * yes yes none collections.OrderedDict()

* — can be found in a separate module

Categorising Python’s built-in container data types

The mentioned container types in Python can be segregated using the following criteria:

  • container mutability, or lack of thereof,
  • determinable order of contained elements, or lack of thereof,
  • the way the contained elements are accessed.

Mutable, immutable and hashable objects

What every newcomer to Python quickly learns is that all objects in Python can be either mutable or immutable. The fact that a container object is immutable doesn’t always mean that the objects it holds are also immutable (e.g. an immutable tuple holding mutable lists). However, container objects are fully immutable only if the object itself, and the objects it contains are recursively immutable. Recursively immutable objects may be hashable. This is important as only hashable objects can be used in a mapping container object (see below) as keys.

All of Python’s immutable built-in objects are hashable, while no mutable containers (such as lists or dictionaries) are.

Source: http://docs.python.org/release/3.1.3/glossary.html

Examples of mutable containers include:

  • list,
  • set,
  • dictionary,
  • OrderedDictionary
  • bytearray
  • array

Examples of immutable containers include:

  • string,
  • frozenset,
  • tuple,
  • bytes

The main implication of the mutable/immutable distinction and hashability is that not all container object can store all other container objects, in particular:

  • sets can store only hashable object (each object in set has to have a unique hash — sets do not store duplicate objects, as opposed to e.g. lists or tuples)
  • dictionaries can have only hashable objects as keys

Now, an interesting thing is that instances of custom classes in Python are by default hashable (even if they are by nature mutable), with their hash being their id(object). This means that two, seeming identical object instances of a custom class will have different hashes unless they implement valid __hash__() and __eq__() functions.  This is illustrated by the following code.

class MyClass1:
    """ This class does not implement any
    explicit __hash__() not __eq__() function. Thus
    the hash of the object is by default
    obtained using the id() function. """
    def __init__ (self, x):
        self.data = x
    def __getitem__(self, x):
        return self.data[x]

class MyClass2:
    """ This class does implement
    a valid __hash__() and __eq__() function. Thus
    the hash value is computed as expected. """
    def __init__ (self, x):
        self.data = x
    def __getitem__(self, x):
        return self.data[x]
    def __hash__(self):
        return hash(self.data)
    def __eq__(x, y):
        return hash(x) == hash(y)

obj1 = MyClass1((1,2,3))  # instance of MyClass1
obj2 = MyClass1((1,2,3))  # different, but identical, instance of MyClass1
my_set = {obj1, obj2}  # The two object are identical. We would expect only one to be added to set
print (my_set)
# output:  {<__main__.MyClass1 object at 0x1d3e110>, <__main__.MyClass1 object at 0x1d3e050>}
# Not good -- two identical objects are in the set. This is because their hash value is obtained from the id() function.

obj1 = MyClass2((1,2,3))  # instance of MyClass2
obj2 = MyClass2((1,2,3))  # different, but identical, instance of MyClass2
my_set = {obj1, obj2}  # The two object are identical. We would expect only one to be added to set
print (my_set)
# output:  {<__main__.MyClass2 object at 0x1d3e1d0>}
# As the object are identical, and hashed correctly, only one of them is actually inside the set.

Also, for the hashability to work in an expected manner, the programmer must “promise” that hashable object will not change during they lifetime. This promise, however, can be broken. Yet this can lead to unexpected problem in later development stages.

Why the distinction between mutable and immutable objects?

  1. Immutable objects can potentially be faster.
  2. Recursively immutable object are potentially hashable. Because such object never change their content throughout their lifetime, they can be used as keys in dictionaries. Also, hashability allows the use of the object in a set (sets store only elements with a unique hash).
  3. Code using immutable object is safer.

Order and unordered containers

Container object can store their content in either an ordered or unordered manner. Order, or lack of thereof, is unrelated to the mutability of objects.  This means that both mutable and immutable objects can be either ordered or unordered.

Examples of ordered containers include:

  • list,
  • string,
  • tuple,
  • bytes,
  • bytearrays,
  • collections.OrderedDict.
  • array

Examples of unordered containers include:

  • dictionary,
  • set,
  • frozenset.

When iterating over data in an ordered container object the data is a accesses in a determinable manner. When iterating over data in an unordered container object the data is accessed in an undetermined order. This is illustrated by the following code fragment.

my_list = list(range(10))
my_list.append (10)
my_list.append("text")
my_list.append(11)
print ("my_list:", my_list)

my_set = set(range(10))
my_set.add(10)
my_set.add("text")
my_set.add(11)
print ("my_set: ", my_set)

keys = "a b c d e f g h i j".split(" ")  # create a list of keys
my_dict = dict(zip(keys, range(10))) # zip() creates a dictionary from two sequences
my_dict['k']=10
my_dict["text_key"]="text_val"
my_dict['l']=11
print ("my_dict:", my_dict)

# program output:
# my_list: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 'text', 11]
# my_set:  {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 'text'}
# my_dict: {'a': 0, 'c': 2, 'b': 1, 'e': 4, 'd': 3, 'g': 6, 'f': 5, 'i': 8, 'h': 7, 'j': 9, 'l': 11, 'k': 10, 'text_key': 'text_val'}

# as we can see, only elements in the my_list were output in a manner we could expect

Set, sequence, mapping and iterable container types

A different criterion with which one can divide container objects is by the way elements contained within those are accessed. This give rise to sequence, mapping, set and iterable container types.

Now, the interesting part is the distinction between set/sequence/mapping container types and the iterable container types . It was really hard to find any in-depth information on this. I reckon it was because most people just conform to the magic of Python according to which  “things just works”. I got interested why do they work the way they do — why are my simple custom sequence containers iterable even though they do not contain any __iter__() functions? What follows is what I gathered from the pieces of information I had found. Feel free to correct me if I erred somewhere.

Sequence types and sequence iterator

Sequence and mapping container object are quite similar. In each of them data stored is accessed by means of a key. The main difference is that in sequence containers values are accessed by keys implemented as (hashable) integers from 0 to n-1, where n is equal to the number of elements in the container, whereas in mapping containers, such key can be any hashable objects (e.g. tuples).

Sequence data types include e.g.

  • str,
  • bytes,
  • bytearray,
  • list,
  • tuple,
  • range.

All built-in sequence types are by default iterable as they implement an __iter__() function. This functions returns, depending on the specific built-in container object type, a list_iterator, tuple_iterator, str_iterator, bytes_iterator, bytearray_iterator or a range_iterator objects.

Custom sequence types are also iterable even if they do not explicitly implement an __iter__() function. In such case the __iter__() cannot be called, but an iterator object can still be retrieved with the iter(sequence_type_object) function as soon as you add a __getitem__() function in your class. To give an example of a simplistic __getitem__() function:

def __getitem__(self, x):
   return self.data[x]

This is the case because in such object this function is used by an implicit sequence iterator (see more in “Iterator types” section), which, because the values are mapped using integer keys from 0 to n-1, can with no trouble ‘predict’ the names of the keys.

Mapping types

As mentioned earlier, mapping container objects can use any hashable object as a key which servers as a mapping to a value.

Mapping types include e.g.:

  • dict,
  • collections.OrderedDict.

All built-in mapping types are by default iterable as they implement the __iter__() function.

Simple custom mapping objects types are generally not iterable unless they explicitly implement an __iter__() function. If this is not the case case __iter__() obviously cannot be called directly, but an iterator object can still be retrieved with the iter(mapping_object) function. Such iterator object will, however, only work if the keys in the dictionary are integers from 0 to n where n+1 is the number of items in the dictionary, which is rarely the case. Thus for custom mapping types it is advisable to inherit from the dict class.

Set types

Set container objects store hashable objects. The elements in sets are unordered.

Set data types include e.g.:

  • set,
  • frozenset.

All built-in set types are by default iterable as they implement an __iter__() function. This function returns, in the case of set and frozentset types, the set_iterator and frozenset_iterator objects respectively.

Custom set container objects have to explicitly implement the __iter__() function to be iterable.

Iterable types

Objects stored in pure iterable container objects cannot be accessed by means of a key, but can only be iterated over using a iterator object. Iterable containers implement an __iter__() function which returns the iterator object, which in turn implements an __iter__() function, returning itself and a __next__() returning next element in the container (or throwing an exception if the end has been reached).

Python defines several iterator objects to support iteration over general and specific sequence types, dictionaries, and other more specialized forms.

Source: http://docs.python.org/library/stdtypes.html

Now bare with me for a moment. Custom sequence/set/mapping containers do not have to implement the aforementioned iterator-related function. Thus, in pure theory, iterable and set/sequence/mapping containers are quite distinct things. However, in practice:

  • all built-in container types (set, sequence, mapping) also explicitly implement a __iter__() function, returning adequate iterator objects, e.g. list_iterator, set_iterator, tuple_iterator objects,
  • all custom sequence containers explicitly implementing a __getitem__() also implicitly implement an implicit sequence iterator returned via the iter() built-in function, returning an iterator object.

This boils down to the fact that in Python all mentioned built-in sequence/mapping/set containers are also iterable containers. All custom sequence containers are also iterable containers (due to implicit sequence iterator). However, not all iterable containers are sequence/mapping/set containers.


Interesting articles:

http://www.cs.toronto.edu/~tijmen/programming/immutableDictionaries.html

http://www.voidspace.org.uk/python/articles/mapping_sequence_ref.shtml

http://docs.python.org/py3k/library/stdtypes.html

5,639 ResponsesLeave one →

  1. [url=https://creative-bg.net/drehi-za-zheni/banski ]Дамски бански
    [/url]

    Reply
  2. In [url=https://www.iarena.ro]magazinul[/url] nostru gasesti articole vestimentare si incaltaminte cu personalitate, care pot construi tinutele must-have perfecte, conform preferintelor tale.

    [url=https://www.iarena.ro/collections/tenisi ]tenisi dama
    [/url]

    Reply
  3. best free dating site london
    [url="http://allfreedatinghyp.com/?"]most popular free dating sites in the world[/url]

    Reply
  4. [url=https://lendingmain.com/]bad credit auto loans[/url] [url=https://titaniclending.com/]cash advance texas[/url]

    Reply
  5. [url=http://cashadvanceft.com/]apply for loan online[/url]

    Reply
  6. [url=http://abcpersonalloans.com/]personal loan website[/url]

    Reply
  7. [url=https://pharmicx.com/]buy fluoxetine online mexico[/url]

    Reply
  8. скачать базы для хрумера 2021

    Вы занимаетесь продвижением сайтов? Тогда вам к нам. [url=https://goo.su/4zRx]Наша группа в телеграмме[/url].У нас вы можете выбрать любую нужную для вашей работы базу для прогонов Xrumer и GSA, allsubmitter по разной ценовой категории.купить базы для хрумера
    [url=https://seoprofisional.ru/bazy/baza-kitajskix-domenov]база wordpress сайтов[/url]

    Reply
  9. базы каталогов для хрумера

    Вы занимаетесь продвижением сайтов? Тогда вам к нам. [url=https://goo.su/4zRx]Наша группа в телеграмме[/url].У нас вы можете выбрать любую нужную для вашей работы базу для прогонов Xrumer и GSA, allsubmitter по разной ценовой категории.базы хрумера купить
    [url=https://seoprofisional.ru/bazy/svezhayabazaforumov2021]Свежая база форумов 2021[/url]

    Reply
  10. базы хрумера купить

    Вы занимаетесь продвижением сайтов? Тогда вам к нам. [url=https://goo.su/4zRx]Наша группа в телеграмме[/url]. У нас вы можете выбрать любую нужную для вашей работы базу для прогонов Xrumer и GSA, allsubmitter по разной ценовой категории.базы хрумера 2021

    Reply
  11. успешные базы для хрумера

    Вы занимаетесь продвижением сайтов? Тогда вам к нам. [url=https://goo.su/4zRx]Наша группа в телеграмме[/url].У нас вы можете выбрать любую нужную для вашей работы базу для прогонов Xrumer и GSA, allsubmitter по разной ценовой категории.как собрать базы для хрумера
    [url=https://seoprofisional.ru/bazy/bazarudomenov]База ру доменов[/url]

    Reply
  12. база досок для хрумера

    Вы занимаетесь продвижением сайтов? Тогда вам к нам. [url=https://goo.su/4zRx]Наша группа в телеграмме[/url].У нас вы можете выбрать любую нужную для вашей работы базу для прогонов Xrumer и GSA, allsubmitter по разной ценовой категории.базы каталогов для хрумера
    [url=https://seoprofisional.ru/bazy/svezhayabazaforumov2021]Свежая база форумов 2021[/url]

    Reply
  13. The Best Places To Time Hookup Girls

    The number of hookup females for just one person is generally small and it means if you hire a company who is really like yourself in all respect, the odds are quite high they are also apt to be a great match for you personally [url=https://wikihookup.com/closet-case-hookup]https://wikihookup.com/closet-case-hookup[/url] Can you imagine if you don’t have much good fortune with internet hookups? Properly, there are more methods that you can start locating somebody to hookup with. Whilst these techniques is probably not as fast as utilizing online dating, they may be more convenient and therefore are often cheaper, which definitely means they are a viable choice.

    Totally free Hookup Ladies: One important thing that you can do is usually to seem online for a free online dating internet site. Usually these web sites are strictly for single individuals, but there are many internet sites that meet the needs of partners or friendships too. While they are certainly not designed specifically for hookups, there are still some very good opportunities at free of charge hookups. This might not be a great way for you to fulfill a hookup, but it could be a great approach to finding out if this type of individual is someone that you will feel relaxed with dating or connecting with with a a lot more long lasting time frame.

    Paid Internet dating Solutions: There are on the internet solutions like hookup cooler and Zoosk which can be free of charge to sign up for. They have got both paid and free types, and both of them have their own advantages. Several of the advantages of a paid for service incorporate the fact that you understand specifically what you are actually engaging in before you even sign in to your account, which means you may have additional control over the condition, and when you purchase not to complement it, it is possible to stop at any moment.

    Reside On-line Hookups: There are certainly numerous places where on the web hookup professional services are very common. India is among one of these nations. In India, numerous teenagers, notably solitary women, will leverage the internet to discover somebody to get a one particular night time remain with. In numerous areas of Asian countries, men and women head to karaoke pubs and open public dances and then try to fulfill a person for the time. There is a lot of gender involved and it is perfectly acceptable in numerous Asian ethnicities.

    In the usa, hookup online dating sites are becoming more popular. The reason being they offer an easy way for individuals from all of the avenues of life to locate anyone to particular date. As many dating sites fee a little monthly fee, there is absolutely no reason why anybody who is interested in finding someone should struggle to do so on the web free of charge. It really is less hazardous than conference personally, and it also allows you to be in the personal privacy of your very own property. With these solutions, it is possible to search through profiles and find out if you find anybody that you are interested in.

    Transunion: As mentioned above, hookup courting online does have its drawbacks. The demise than it is it is very very easy to lay about your age group, earnings, or relationship position. For that reason, you could wind up paying months seeking to get the best go with. Among the finest solutions to find suits for queers is TransUnion. The best part regarding it is that you can get credit report checks, spend minimal, and in many cases you will definitely get instant credit rating authorization.

    I would definitely recommend these three services as the simplest way to hookup with women. When you prefer to use free of charge online dating sites, make sure to seek information before you sign up. Some websites are fake, misleading, and will result in harm to your potential. Remember to find out the online privacy policy and policies of the website, and make sure the internet site has been in existence for quite a while. All of these variables will allow you to find the best service for your requirements.

    Hookups with women is a wonderful way to fulfill a new companion and experience a new customs. If you are searching to date a girl on the internet, remember that there are many deceitful online dating sites. The best advice is to look into the Much better Enterprise Bureau before employing any dating online providers. It’s always better to be safe than sorry. No matter if you choose to use on-line hookup providers or otherwise not, there are several individuals who are trying to find a partnership precisely like you.

    Reply
  14. [url=http://tabspluscaps.com/]zoloft 50 mg online[/url]

    Reply
  15. [url=https://topoloans.com/]online loans no credit check[/url]

    Reply
  16. Trandate [url=http://onlinecanda21.com/ ]Imdur[/url] canada pharma limited llc

    Reply
  17. [url=https://augmentinab.com/]augmentin 625 uk[/url]

    Reply
  18. Приветсвую Вас!
    Я не стану много рассказывать про разные способы получения дохода с вашего ресурса,
    скажу только, что я его проверил и он готов для
    получения пассивного заработка.
    Нужно просто проставить небольшой кусок кода и начать зарабатывать на трафике с вашего сайта.
    Спасибо за то, что дочитали до конца, коллега.
    [url=https://bit.ly/32IqCwo][u]Вот ваша ссылка[/u][/url] на получение инструкции по установке кода.

    Reply
  19. база досок для хрумера

    Вы занимаетесь продвижением сайтов? Тогда вам к нам. [url=https://goo.su/4zRx]Наша группа в телеграмме[/url]. У нас вы можете выбрать любую нужную для вашей работы базу для прогонов Xrumer и GSA, allsubmitter по разной ценовой категории.база досок для хрумера
    [url=https://seoprofisional.ru/bazy/svezhayabazaforumov2021]база для хрумера[/url]

    Reply
  20. свежая база хрумера

    Вы занимаетесь продвижением сайтов? Тогда вам к нам. [url=https://goo.su/4zRx]Наша группа в телеграмме[/url]. У нас вы можете выбрать любую нужную для вашей работы базу для прогонов Xrumer и GSA, allsubmitter по разной ценовой категории.база для профилей для хрумера
    [url=https://seoprofisional.ru/bazy/baza-kitajskix-domenov]купить базы для хрумера[/url]

    Reply
  21. база для профилей для хрумера

    Вы занимаетесь продвижением сайтов? Тогда вам к нам. [url=https://goo.su/4zRx]Наша группа в телеграмме[/url]. У нас вы можете выбрать любую нужную для вашей работы базу для прогонов Xrumer и GSA, allsubmitter по разной ценовой категории.русские базы для хрумера
    [url=https://seoprofisional.ru/bazy/bazarudomenov]база для хрумера[/url]

    Reply
  22. [url=https://jaseloans.com/]loans for business[/url]

    Reply
  23. [url=http://bertlending.com/]payday advance bad credit[/url]

    Reply
  24. [url=https://drawing-portal.com]Online CAD School[/url] Yevgenia Kuritsina

    Reply
  25. Juliwiq

     /  2021/04/21

    Novosti

    Reply
  26. [url=http://duhovki.info]Духовки и варочные поверхности[/url]

    Reply
  27. Tolikhkj

     /  2021/04/17

    Novosti

    Reply
  28. [url=http://bestweddingdress.top]Best wedding dress[/url]

    Reply
  29. free local dating sites
    [url="http://freedatingsitesus.com/?"]adult ads [/url]

    Reply
  30. база ссылок для хрумера

    Вы занимаетесь продвижением сайтов? Тогда вам к нам. [url=https://goo.su/4zRx]Наша группа в телеграмме[/url].У нас вы можете выбрать любую нужную для вашей работы базу для прогонов Xrumer и GSA, allsubmitter по разной ценовой категории.база для хрумера купить
    [url=https://seoprofisional.ru/bazy/svezhayabazaforumov2021]Свежая база форумов 2021[/url]

    Reply
  31. успешные базы для хрумера

    Вы занимаетесь продвижением сайтов? Тогда вам к нам. [url=https://goo.su/4zRx]Наша группа в телеграмме[/url].У нас вы можете выбрать любую нужную для вашей работы базу для прогонов Xrumer и GSA, allsubmitter по разной ценовой категории.скачать базы для хрумера 2021
    [url=https://seoprofisional.ru/bazy/bazarudomenov]как собрать базы для хрумера[/url]

    Reply
  32. база ссылок для хрумера

    Вы занимаетесь продвижением сайтов? Тогда вам к нам. [url=https://goo.su/4zRx]Наша группа в телеграмме[/url].У нас вы можете выбрать любую нужную для вашей работы базу для прогонов Xrumer и GSA, allsubmitter по разной ценовой категории.база данных wordpress сайта
    [url=https://seoprofisional.ru/bazy/bazarudomenov]база для хрумера[/url]

    Reply
  33. русские базы для хрумера

    Вы занимаетесь продвижением сайтов? Тогда вам к нам. [url=https://goo.su/4zRx]Наша группа в телеграмме[/url].У нас вы можете выбрать любую нужную для вашей работы базу для прогонов Xrumer и GSA, allsubmitter по разной ценовой категории.база ссылок хрумера
    [url=https://seoprofisional.ru/bazy/baza-kitajskix-domenov] База китайских доменов 2021[/url]

    Reply
  34. как создать базу для хрумера

    Вы занимаетесь продвижением сайтов? Тогда вам к нам. [url=https://goo.su/4zRx]Наша группа в телеграмме[/url].У нас вы можете выбрать любую нужную для вашей работы базу для прогонов Xrumer и GSA, allsubmitter по разной ценовой категории.успешные базы для хрумера
    [url=https://seoprofisional.ru/bazy/bazy-ssha-dlya-xrumera]база для хрумера скачать[/url]

    Reply
  35. база профилей для хрумера

    Вы занимаетесь продвижением сайтов? Тогда вам к нам. [url=https://goo.su/4zRx]Наша группа в телеграмме[/url].У нас вы можете выбрать любую нужную для вашей работы базу для прогонов Xrumer и GSA, allsubmitter по разной ценовой категории.база для хрумера 20 миллионов
    [url=https://seoprofisional.ru/bazy/bazy-ssha-dlya-xrumera]база для хрумера скачать[/url]

    Reply
  36. базы каталогов для хрумера

    Вы занимаетесь продвижением сайтов? Тогда вам к нам. [url=https://goo.su/4zRx]Наша группа в телеграмме[/url].У нас вы можете выбрать любую нужную для вашей работы базу для прогонов Xrumer и GSA, allsubmitter по разной ценовой категории.базы для хрумера 2019
    [url=https://seoprofisional.ru/bazy/baza-kitajskix-domenov]база wordpress сайтов[/url]

    Reply
  37. база для профилей для хрумера

    Вы занимаетесь продвижением сайтов? Тогда вам к нам. [url=https://goo.su/4zRx]Наша группа в телеграмме[/url].У нас вы можете выбрать любую нужную для вашей работы базу для прогонов Xrumer и GSA, allsubmitter по разной ценовой категории.русские базы для хрумера
    [url=https://seoprofisional.ru/bazy/bazy-ssha-dlya-xrumera]Базы сша для хрумера[/url]

    Reply
  38. купить базы для хрумера

    Вы занимаетесь продвижением сайтов? Тогда вам к нам. [url=https://goo.su/4zRx]Наша группа в телеграмме[/url].У нас вы можете выбрать любую нужную для вашей работы базу для прогонов Xrumer и GSA, allsubmitter по разной ценовой категории.база ссылок хрумера
    [url=https://seoprofisional.ru/bazy/bazarudomenov]купить базы для хрумера[/url]
    [url=https://seoprofisional.ru]наша группа в телеграмме[/url]

    Reply
  39. [url=http://bnfcash.com/]loans no credit check[/url]

    Reply
  40. купить базы для хрумера

    Вы занимаетесь продвижением сайтов? Тогда вам к нам. [url=https://goo.su/4zRx]Наша группа в телеграмме[/url].У нас вы можете выбрать любую нужную для вашей работы базу для прогонов Xrumer и GSA, allsubmitter по разной ценовой категории.база ссылок хрумера
    [url=https://seoprofisional.ru/bazy/svezhayabazaforumov2021]база для хрумера[/url]
    [url=https://seoprofisional.ru]наша группа в телеграмме[/url]

    Reply
  41. свежая база хрумера

    Вы занимаетесь продвижением сайтов? Тогда вам к нам. [url=https://goo.su/4zRx]Наша группа в телеграмме[/url].У нас вы можете выбрать любую нужную для вашей работы базу для прогонов Xrumer и GSA, allsubmitter по разной ценовой категории.база досок для хрумера
    [url=https://seoprofisional.ru/bazy/bazy-ssha-dlya-xrumera]база для хрумера скачать[/url]
    [url=https://seoprofisional.ru]наша группа в телеграмме[/url]

    Reply
  42. [url=https://jipcash.com/]business loan[/url]

    Reply
  43. Заказать seo поисковую оптимизацию сайта, Заказать услуги по продвижению сайта По всем возникшим вопросам Вы можете обратиться в скайп логин [b]pokras7777[/b]Раскрутка сайта под ключ
    .Так же собираем базы Обратесь всегда будем рабы вам помочь [url=https://seoprofisional.ru]наша группа в телеграмме[/url]

    Reply
  44. база сайтов на wordpress

    Вы занимаетесь продвижением сайтов? Тогда вам к нам. [url=https://goo.su/4zRx]Наша группа в телеграмме[/url].У нас вы можете выбрать любую нужную для вашей работы базу для прогонов Xrumer и GSA, allsubmitter по разной ценовой категории.базы хрумера купить
    [url=https://seoprofisional.ru/bazy/baza-kitajskix-domenov]купить базы для хрумера[/url]

    Reply
  45. [url=https://padalending.com/]small personal loans with bad credit[/url]

    Reply
  46. базы хрумера купить

    Вы занимаетесь продвижением сайтов? Тогда вам к нам. У нас вы можете выбрать любую нужную для вашей работы базу для прогонов Xrumer и GSA, allsubmitter по разной ценовой категории.успешные базы для хрумера
    [url=https://seoprofisional.ru/bazy/svezhayabazaforumov2021]база для хрумера[/url]

    Reply
  47. базы каталогов для хрумера

    Вы занимаетесь продвижением сайтов? Тогда вам к нам. У нас вы можете выбрать любую нужную для вашей работы базу для прогонов Xrumer и GSA, allsubmitter по разной ценовой категории.базы для хрумера для досок объявлений
    [url=https://seoprofisional.ru/bazy/svezhayabazaforumov2021]скачать купить базы для хрумера[/url]

    Reply
  48. [url=https://junloans.com/]loans with low interest[/url]

    Reply
  49. [url=http://rpdcash.com/]cash loans with no credit[/url]

    Reply
  50. Заказать seo поисковую оптимизацию сайта, Заказать услуги по продвижению сайта По всем возникшим вопросам Вы можете обратиться в скайп логин [b]pokras7777[/b]Раскрутка сайта под ключ
    .Так же собираем базы Обратесь всегда будем рады вам помочь [url=https://seoprofisional.ru]Свежая база 2021 форумов[/url]

    Reply

Leave a Reply to Latonyaeling